From bc0522f18ed2a4efef78dda7094787c3b4c84829 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 14 May 2025 10:42:11 +0200 Subject: [PATCH 01/61] feat: prototype of custom babel loader --- apps/tester-app/babel.config.js | 31 ++- apps/tester-app/rspack.config.mjs | 18 +- packages/repack/package.json | 2 + packages/repack/src/commands/rspack/start.ts | 1 + .../src/loaders/babelLoader/babelLoader.ts | 151 ++++++++++++ .../repack/src/loaders/babelLoader/index.ts | 4 + .../repack/src/plugins/DevelopmentPlugin.ts | 2 + pnpm-lock.yaml | 227 ++++++------------ pnpm-workspace.yaml | 2 +- 9 files changed, 269 insertions(+), 169 deletions(-) create mode 100644 packages/repack/src/loaders/babelLoader/babelLoader.ts create mode 100644 packages/repack/src/loaders/babelLoader/index.ts diff --git a/apps/tester-app/babel.config.js b/apps/tester-app/babel.config.js index 4e00b6f53..687e94209 100644 --- a/apps/tester-app/babel.config.js +++ b/apps/tester-app/babel.config.js @@ -1,13 +1,32 @@ module.exports = { - presets: ['module:@react-native/babel-preset'], - comments: true, plugins: [ + '@babel/plugin-syntax-typescript', + '@react-native/babel-plugin-codegen', + '@babel/plugin-transform-flow-strip-types', [ '@babel/plugin-transform-react-jsx', - { - runtime: 'automatic', - importSource: 'nativewind', - }, + { runtime: 'automatic', importSource: 'nativewind' }, ], + 'react-native-reanimated/plugin', + ], + overrides: [ + { + test: /\.ts$/, + plugins: [ + [ + '@babel/plugin-syntax-typescript', + { isTSX: false, allowNamespaces: true }, + ], + ], + }, + { + test: /\.tsx$/, + plugins: [ + [ + '@babel/plugin-syntax-typescript', + { isTSX: true, allowNamespaces: true }, + ], + ], + }, ], }; diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 107772471..5e373f8e1 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -2,7 +2,7 @@ import path from 'node:path'; import * as Repack from '@callstack/repack'; import { NativeWindPlugin } from '@callstack/repack-plugin-nativewind'; -import { ReanimatedPlugin } from '@callstack/repack-plugin-reanimated'; +// import { ReanimatedPlugin } from '@callstack/repack-plugin-reanimated'; import { RsdoctorRspackPlugin } from '@rsdoctor/rspack-plugin'; const dirname = Repack.getDirname(import.meta.url); @@ -22,6 +22,9 @@ export default (env) => { mode, context, entry: './index.js', + experiments: { + parallelLoader: true, + }, resolve: { ...Repack.getResolveOptions({ enablePackageExports: true }), }, @@ -32,7 +35,18 @@ export default (env) => { rules: [ ...Repack.getJsTransformRules({ swc: { importSource: 'nativewind' }, + flow: { enabled: false }, + codegen: { enabled: false }, }), + { + test: /\.[cm]?[jt]sx?$/, + use: { + loader: '@callstack/repack/babel-loader', + parallel: true, + options: {}, + }, + type: 'javascript/auto', + }, { test: Repack.getAssetExtensionsRegExp( Repack.ASSET_EXTENSIONS.filter((ext) => ext !== 'svg') @@ -122,7 +136,7 @@ export default (env) => { // exclude: /index.bundle$/, // }), process.env.RSDOCTOR && new RsdoctorRspackPlugin(), - new ReanimatedPlugin(), + // new ReanimatedPlugin(), new NativeWindPlugin({ cssInteropOptions: { inlineRem: 16 } }), ].filter(Boolean), }; diff --git a/packages/repack/package.json b/packages/repack/package.json index d32ebf524..e0106fe1c 100644 --- a/packages/repack/package.json +++ b/packages/repack/package.json @@ -10,6 +10,7 @@ "./client": "./client/index.js", "./commands/*": "./commands/*.js", "./assets-loader": "./dist/loaders/assetsLoader/index.js", + "./babel-loader": "./dist/loaders/babelLoader/index.js", "./flow-loader": "./dist/loaders/flowLoader/index.js", "./react-refresh-loader": "./dist/loaders/reactRefreshLoader/index.js", "./mf/*": "./mf/*.js", @@ -87,6 +88,7 @@ "exit-hook": "^4.0.0", "flow-remove-types": "^2.268.0", "gradient-string": "^2.0.2", + "hermes-parser": "^0.28.1", "image-size": "^1.1.1", "jsonwebtoken": "^9.0.2", "memfs": "^4.11.1", diff --git a/packages/repack/src/commands/rspack/start.ts b/packages/repack/src/commands/rspack/start.ts index 2541a0cb3..9f1972f86 100644 --- a/packages/repack/src/commands/rspack/start.ts +++ b/packages/repack/src/commands/rspack/start.ts @@ -86,6 +86,7 @@ export async function start( const { createServer } = await import('@callstack/repack-dev-server'); const { start, stop } = await createServer({ + // @ts-ignore options: { ...devServerOptions, rootDir: cliConfig.root, diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts new file mode 100644 index 000000000..63cf082e7 --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -0,0 +1,151 @@ +import fs from 'node:fs'; +import path from 'node:path'; +import { + type Node, + type TransformOptions, + parseSync, + transformFromAstSync, +} from '@babel/core'; +// @ts-ignore +import * as hermesParser from 'hermes-parser'; + +import type { LoaderContext } from '@rspack/core'; + +export const raw = false; + +function isTypeScriptSource(fileName: string) { + return !!fileName && fileName.endsWith('.ts'); +} + +function isTSXSource(fileName: string) { + return !!fileName && fileName.endsWith('.tsx'); +} + +interface CustomOptions { + enableBabelRCLookup?: boolean; + extendsBabelConfigPath?: string; + projectRoot: string; +} +/** + * Return a memoized function that checks for the existence of a + * project level .babelrc file, and if it doesn't exist, reads the + * default RN babelrc file and uses that. + */ +const getBabelRC = (() => { + let babelRC: TransformOptions | null = null; + + return function _getBabelRC({ + projectRoot, + extendsBabelConfigPath, + }: CustomOptions) { + if (babelRC != null) { + return babelRC; + } + + babelRC = { + plugins: [], + extends: extendsBabelConfigPath, + }; + + if (extendsBabelConfigPath) { + return babelRC; + } + + // Let's look for a babel config file in the project root. + let projectBabelRCPath: string | undefined; + + // .babelrc + if (projectRoot) { + projectBabelRCPath = path.resolve(projectRoot, '.babelrc'); + } + + if (projectBabelRCPath) { + // .babelrc.js + if (!fs.existsSync(projectBabelRCPath)) { + projectBabelRCPath = path.resolve(projectRoot, '.babelrc.js'); + } + + // babel.config.js + if (!fs.existsSync(projectBabelRCPath)) { + projectBabelRCPath = path.resolve(projectRoot, 'babel.config.js'); + } + + // If we found a babel config file, extend our config off of it + // otherwise the default config will be used + if (fs.existsSync(projectBabelRCPath)) { + babelRC.extends = projectBabelRCPath; + } + } + + return babelRC; + }; +})(); + +function buildBabelConfig( + filename: string, + options: CustomOptions +): TransformOptions { + const babelRC = getBabelRC(options); + + const extraConfig: TransformOptions = { + babelrc: options.enableBabelRCLookup ?? true, + code: true, + cwd: options.projectRoot, + filename, + highlightCode: false, + compact: false, + }; + + return { ...babelRC, ...extraConfig }; +} + +const transform = ({ + filename, + options, + src, +}: { + filename: string; + options: CustomOptions; + src: string; +}) => { + const babelConfig: TransformOptions = { + sourceType: 'unambiguous', + ...buildBabelConfig(filename, options), + caller: { name: 'repack' }, + ast: false, + cloneInputAst: false, + }; + + const sourceAst: Node = + isTypeScriptSource(filename) || isTSXSource(filename) + ? parseSync(src, babelConfig) + : hermesParser.parse(src, { + babel: true, + flow: 'all', + reactRuntimeTarget: '19', + sourceType: babelConfig.sourceType, + }); + + return transformFromAstSync(sourceAst, src, babelConfig); +}; + +export default function babelLoader(this: LoaderContext, source: string) { + this.cacheable(); + const callback = this.async(); + + try { + const result = transform({ + filename: this.resourcePath, + src: source, + options: { + enableBabelRCLookup: true, + // this is currently broken in Rspack and needs to be fixed upstream + projectRoot: this.rootContext, + }, + }); + // @ts-ignore + callback(null, result.code, result.map); + } catch (e) { + callback(e as Error); + } +} diff --git a/packages/repack/src/loaders/babelLoader/index.ts b/packages/repack/src/loaders/babelLoader/index.ts new file mode 100644 index 000000000..8fd14636d --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/index.ts @@ -0,0 +1,4 @@ +import babelLoader, { raw } from './babelLoader.js'; + +export { raw }; +export default babelLoader; diff --git a/packages/repack/src/plugins/DevelopmentPlugin.ts b/packages/repack/src/plugins/DevelopmentPlugin.ts index d9a543aeb..a2398ea53 100644 --- a/packages/repack/src/plugins/DevelopmentPlugin.ts +++ b/packages/repack/src/plugins/DevelopmentPlugin.ts @@ -1,4 +1,5 @@ import path from 'node:path'; +// @ts-ignore import type { DevServerOptions } from '@callstack/repack-dev-server'; import type { Compiler, @@ -104,6 +105,7 @@ export class DevelopmentPlugin implements RspackPluginInstance { const host = compiler.options.devServer.host; const port = compiler.options.devServer.port; + // @ts-ignore const protocol = this.getProtocolType(compiler.options.devServer); const platform = this.config.platform ?? (compiler.options.name as string); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52362736f..1d558dffb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: ^0.6.3 version: 0.6.3 '@rspack/core': - specifier: ^1.3.5 - version: 1.3.5 + specifier: ^1.3.6 + version: 1.3.7 '@swc/helpers': specifier: ~0.5.17 version: 0.5.17 @@ -161,10 +161,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.11 - version: 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.5(@swc/helpers@0.5.17) + version: 1.3.7(@swc/helpers@0.5.17) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.8.3) @@ -194,7 +194,7 @@ importers: version: 8.5.1 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(@rspack/core@1.3.5(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5) + version: 8.1.1(@rspack/core@1.3.7(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5) react-native-test-app: specifier: catalog:testers version: 4.3.3(react-native@0.79.1(@babel/core@7.25.2)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@19.0.10)(react@19.0.0))(react@19.0.0) @@ -261,10 +261,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.5(@swc/helpers@0.5.17) + version: 1.3.7(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -294,7 +294,7 @@ importers: version: link:../../packages/repack '@module-federation/enhanced': specifier: 0.12.0 - version: 0.12.0(@rspack/core@1.3.5(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) + version: 0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) '@module-federation/runtime': specifier: 0.12.0 version: 0.12.0 @@ -340,10 +340,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.5(@swc/helpers@0.5.17) + version: 1.3.7(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -483,7 +483,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.5(@swc/helpers@0.5.17) + version: 1.3.7(@swc/helpers@0.5.17) '@types/node': specifier: 'catalog:' version: 18.19.41 @@ -499,7 +499,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.5(@swc/helpers@0.5.17) + version: 1.3.7(@swc/helpers@0.5.17) '@types/dedent': specifier: 0.7.2 version: 0.7.2 @@ -520,7 +520,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.5(@swc/helpers@0.5.17) + version: 1.3.7(@swc/helpers@0.5.17) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -566,6 +566,9 @@ importers: gradient-string: specifier: ^2.0.2 version: 2.0.2 + hermes-parser: + specifier: ^0.28.1 + version: 0.28.1 image-size: specifier: ^1.1.1 version: 1.1.1 @@ -614,13 +617,13 @@ importers: version: 7.24.8(@babel/core@7.25.2) '@module-federation/enhanced': specifier: 0.8.9 - version: 0.8.9(@rspack/core@1.3.5(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) + version: 0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) '@module-federation/sdk': specifier: 0.6.10 version: 0.6.10 '@rspack/core': specifier: 'catalog:' - version: 1.3.5(@swc/helpers@0.5.17) + version: 1.3.7(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -2761,11 +2764,6 @@ packages: cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-arm64@1.3.5': - resolution: {integrity: sha512-bhqi9nZ0jrlQc/YgTklzD02y0E8Emdrov6HLcxt/Dzwq5SZryl4Ik8yc/8E1M0PWNkr09+TO8i1Zc51z0Gfu2g==} - cpu: [arm64] - os: [darwin] - '@rspack/binding-darwin-arm64@1.3.7': resolution: {integrity: sha512-/5k4H0M7vvu7uorhc0OQKdQ7ybcjcJA//ptfYB646Ca/XY8FI1T/H88prPNrLNu97FGqUT4QWo5AHj01XymfDw==} cpu: [arm64] @@ -2781,11 +2779,6 @@ packages: cpu: [x64] os: [darwin] - '@rspack/binding-darwin-x64@1.3.5': - resolution: {integrity: sha512-ysNn7bd/5NdVb0mTDBQl+D9GypCSS7FJoJJEeSpPcN01zFF8lRUsvdbOvzrG/CUBA2qbeWhwZvG2eKOy3p2NRA==} - cpu: [x64] - os: [darwin] - '@rspack/binding-darwin-x64@1.3.7': resolution: {integrity: sha512-/eNcZFDHxo5RVmIxgVM5zxCXmufeWpvviWJMDjhycS175nJb6103YWpu6H0lHgbj0GnHM/Q2VjVRFNhaGbXqdA==} cpu: [x64] @@ -2801,11 +2794,6 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-gnu@1.3.5': - resolution: {integrity: sha512-oEfPjYx3RVsMeHG/kI9k96nLJUQhYfQS9HUKS37Ko3RWC84qTuzMAAdWIXE9ys8GHwpks7pL953AfYNK5PLhPw==} - cpu: [arm64] - os: [linux] - '@rspack/binding-linux-arm64-gnu@1.3.7': resolution: {integrity: sha512-bSxA4MgGOdSvf/nTqNMuLeeyWS4Okh1iPskGuyAv/Sdf7cGbflUyZe6+w7A9BZEFR0CVTfj3f8kt73N+lu72Kg==} cpu: [arm64] @@ -2821,11 +2809,6 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.3.5': - resolution: {integrity: sha512-4cUoxd8nGsCCnqWBqortJRF+VKWzUm7ac9YRMQ+wpoL5i0abcQf8GqeilsNtRBRNqAlAh3mfgRlyeZgWvoS44g==} - cpu: [arm64] - os: [linux] - '@rspack/binding-linux-arm64-musl@1.3.7': resolution: {integrity: sha512-i6QK6YodCA5R8/ShRylkyunwvNcRx/Q7af14jSCa7TPOi6pPoDUL2pmwGcJBk1uPc2wjQwAMZzfJjTWNjEyW2Q==} cpu: [arm64] @@ -2841,11 +2824,6 @@ packages: cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.3.5': - resolution: {integrity: sha512-JehI/z61Y9wwkcTxbAdPtjUnAyyAUCJZOqP3FwQTAd2gBFG/8k7v1quGwrfOLsCLOcT3azbd8YFoHmkveGQayQ==} - cpu: [x64] - os: [linux] - '@rspack/binding-linux-x64-gnu@1.3.7': resolution: {integrity: sha512-6AmOHLOv4XAK7Y5cFDBtnetIZ44MqG8Q6wZ20zjql/khTxsRZa/edis/eUppGb8fy5gzi+qqSAznEZ+Qj3LMrQ==} cpu: [x64] @@ -2861,11 +2839,6 @@ packages: cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.3.5': - resolution: {integrity: sha512-t8BqaOXrqIXZHTrz4ItX/m6BOvbBkeb7qTewlkN5mMHtPAF/Xg203rQ814VXx59kjgGF7i79PXIK2dQxHnCYDA==} - cpu: [x64] - os: [linux] - '@rspack/binding-linux-x64-musl@1.3.7': resolution: {integrity: sha512-rPt0c9UHp5AxWHhjziEtd2uwiWyzM4UZLFJV6hawBWOoIQf2uLSl3fp0HTqxpslfTh3uo5ymhHN/bV48m5THzg==} cpu: [x64] @@ -2881,11 +2854,6 @@ packages: cpu: [arm64] os: [win32] - '@rspack/binding-win32-arm64-msvc@1.3.5': - resolution: {integrity: sha512-k9vf/WgEwxtXzV4la1H6eL07GIlvNjdPdvo1AJZdu0Zcnm600Kv5NSBjySJCp3zUHIKkCE9A0+ibifqbliG0fw==} - cpu: [arm64] - os: [win32] - '@rspack/binding-win32-arm64-msvc@1.3.7': resolution: {integrity: sha512-+Db7NGBzad1dCcSm94uARkIIhbVv1+BXAl1duLBnYQMfqsu/pirsInE9wbp7WVUbSl2hmdRi9MYgWACjoReo4g==} cpu: [arm64] @@ -2901,11 +2869,6 @@ packages: cpu: [ia32] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.3.5': - resolution: {integrity: sha512-dGfGJySHC/ktbNkK/FY2vEpFNK4UT+fgChhmUxIyQaHWjloFGVmEr6NttS0GtdtvblfF3tTzkTe9pGMIkdlegw==} - cpu: [ia32] - os: [win32] - '@rspack/binding-win32-ia32-msvc@1.3.7': resolution: {integrity: sha512-VPqqC0U6FolGoonmZYBBiFyWjQ4+X+e/l/t4QZP2DRonlpE418+MdCxq2ldVGgvtxwERNlz61zxEX9yh/8KOfw==} cpu: [ia32] @@ -2921,11 +2884,6 @@ packages: cpu: [x64] os: [win32] - '@rspack/binding-win32-x64-msvc@1.3.5': - resolution: {integrity: sha512-GujYFTr043jse5gdvofsRvltkH/E8G5h3Yu9JG/+6EyQpFJebYm/NpRQrOyqZLIQP39+tbdViTfW4nOpUuurNA==} - cpu: [x64] - os: [win32] - '@rspack/binding-win32-x64-msvc@1.3.7': resolution: {integrity: sha512-zi9tKxlq85lSYTb1sbEluLjZlkbjuoJoy2TaNzVlfNkmiJ6EiqBbyCWoPPBJRP6HQ9pG25W0y4NWKp7iVhiBvg==} cpu: [x64] @@ -2937,9 +2895,6 @@ packages: '@rspack/binding@1.3.3': resolution: {integrity: sha512-zdwJ801tyC8k+Gu5RjNoc7bEtX0MgJzzVv9qpaMwcAUfUfwZgCzXPTqcGMDoNI+Z47Fw59/2fKCmgZhZn60AgA==} - '@rspack/binding@1.3.5': - resolution: {integrity: sha512-2oluCT+iBnTg0w7XfR8AmfkvgMPSuqEndzhrlHY//qgyyI04CW1lCMgsh+9wcSOUWUKYSOMCiGiVlYFtae5Lcg==} - '@rspack/binding@1.3.7': resolution: {integrity: sha512-jSXLktIGmNNZssxT+fjZ31IyUO7lRoFrFO+XuqKlMpbnHE8yCrpaHE6rLyDPVO4Vnl6xx/df8usUXtZwIc4jrw==} @@ -2967,18 +2922,6 @@ packages: '@swc/helpers': optional: true - '@rspack/core@1.3.5': - resolution: {integrity: sha512-PwIpzXj9wjHM0Ohq6geIKPoh3yNb5oSK74gqzs0plR7pTYLbhrjG/1DSV/JLFF4C5WCpLHHiDEX5E0IYm2Aqeg==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@rspack/tracing': ^1.x - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@rspack/tracing': - optional: true - '@swc/helpers': - optional: true - '@rspack/core@1.3.7': resolution: {integrity: sha512-InXnEmImLKkxzkY7XaAozycjMvS5myf/o3zu1rw5tNq3ONxWvW0QOHVTcrF0FbeKQ/jCOFSfdaoFjbXjdUs38w==} engines: {node: '>=16.0.0'} @@ -5049,6 +4992,9 @@ packages: hermes-estree@0.28.0: resolution: {integrity: sha512-M5IFfnP4RCA2/Hv7VTIlZ1FV4qW33gresbv0SDaSBS/6lax23oV2sg4iE0fhYnpMeQL7Inob+jAeO+mV2T3bKA==} + hermes-estree@0.28.1: + resolution: {integrity: sha512-w3nxl/RGM7LBae0v8LH2o36+8VqwOZGv9rX1wyoWT6YaKZLqpJZ0YQ5P0LVr3tuRpf7vCx0iIG4i/VmBJejxTQ==} + hermes-parser@0.20.1: resolution: {integrity: sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==} @@ -5058,6 +5004,9 @@ packages: hermes-parser@0.28.0: resolution: {integrity: sha512-PPtmoqyz4vv5SqVCYuvJLPKZt+SqCMviICVEygi6jHyfAvDd0cQTV2MfikDd8YXPOszR/9QvauWcGyluxej+rg==} + hermes-parser@0.28.1: + resolution: {integrity: sha512-nf8o+hE8g7UJWParnccljHumE9Vlq8F7MqIdeahl+4x0tvCUJYRrT0L7h0MMg/X9YJmkNwsfbaNNrzPtFXOscg==} + highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} @@ -9850,7 +9799,7 @@ snapshots: '@modern-js/utils@2.65.1': dependencies: '@swc/helpers': 0.5.13 - caniuse-lite: 1.0.30001714 + caniuse-lite: 1.0.30001716 lodash: 4.17.21 rslog: 1.2.3 @@ -9947,7 +9896,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.12.0(@rspack/core@1.3.5(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': + '@module-federation/enhanced@0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/cli': 0.12.0(typescript@5.8.3) @@ -9957,7 +9906,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.12.0(@module-federation/runtime-tools@0.12.0) '@module-federation/managers': 0.12.0 '@module-federation/manifest': 0.12.0(typescript@5.8.3) - '@module-federation/rspack': 0.12.0(@rspack/core@1.3.5(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 btoa: 1.2.1 @@ -9975,7 +9924,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.8.9(@rspack/core@1.3.5(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': + '@module-federation/enhanced@0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/data-prefetch': 0.8.9(react-dom@19.1.0(react@19.0.0))(react@19.0.0) @@ -9984,7 +9933,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.8.9(@module-federation/runtime-tools@0.8.9) '@module-federation/managers': 0.8.9 '@module-federation/manifest': 0.8.9(typescript@5.8.3) - '@module-federation/rspack': 0.8.9(@rspack/core@1.3.5(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 btoa: 1.2.1 @@ -10061,7 +10010,7 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/rspack@0.12.0(@rspack/core@1.3.5(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/dts-plugin': 0.12.0(typescript@5.8.3) @@ -10070,7 +10019,7 @@ snapshots: '@module-federation/manifest': 0.12.0(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 - '@rspack/core': 1.3.5(@swc/helpers@0.5.17) + '@rspack/core': 1.3.7(@swc/helpers@0.5.17) btoa: 1.2.1 optionalDependencies: typescript: 5.8.3 @@ -10080,7 +10029,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/rspack@0.8.9(@rspack/core@1.3.5(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/dts-plugin': 0.8.9(typescript@5.8.3) @@ -10089,7 +10038,7 @@ snapshots: '@module-federation/manifest': 0.8.9(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 - '@rspack/core': 1.3.5(@swc/helpers@0.5.17) + '@rspack/core': 1.3.7(@swc/helpers@0.5.17) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10731,12 +10680,12 @@ snapshots: '@rsdoctor/client@0.4.11': {} - '@rsdoctor/core@0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/core@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) axios: 1.8.4 enhanced-resolve: 5.12.0 filesize: 10.1.6 @@ -10754,10 +10703,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/graph@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) lodash: 4.17.21 socket.io: 4.7.2 source-map: 0.7.4 @@ -10768,14 +10717,14 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/core': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rspack/core': 1.3.5(@swc/helpers@0.5.17) + '@rsdoctor/core': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rspack/core': 1.3.7(@swc/helpers@0.5.17) lodash: 4.17.21 transitivePeerDependencies: - bufferutil @@ -10784,12 +10733,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/sdk@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@rsdoctor/client': 0.4.11 - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -10809,7 +10758,7 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/types@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 @@ -10817,12 +10766,12 @@ snapshots: source-map: 0.7.4 webpack: 5.99.5 optionalDependencies: - '@rspack/core': 1.3.5(@swc/helpers@0.5.17) + '@rspack/core': 1.3.7(@swc/helpers@0.5.17) - '@rsdoctor/utils@0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/utils@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@babel/code-frame': 7.25.7 - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.5(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) '@types/estree': 1.0.5 acorn: 8.14.0 acorn-import-assertions: 1.9.0(acorn@8.14.0) @@ -10860,9 +10809,6 @@ snapshots: '@rspack/binding-darwin-arm64@1.3.3': optional: true - '@rspack/binding-darwin-arm64@1.3.5': - optional: true - '@rspack/binding-darwin-arm64@1.3.7': optional: true @@ -10872,9 +10818,6 @@ snapshots: '@rspack/binding-darwin-x64@1.3.3': optional: true - '@rspack/binding-darwin-x64@1.3.5': - optional: true - '@rspack/binding-darwin-x64@1.3.7': optional: true @@ -10884,9 +10827,6 @@ snapshots: '@rspack/binding-linux-arm64-gnu@1.3.3': optional: true - '@rspack/binding-linux-arm64-gnu@1.3.5': - optional: true - '@rspack/binding-linux-arm64-gnu@1.3.7': optional: true @@ -10896,9 +10836,6 @@ snapshots: '@rspack/binding-linux-arm64-musl@1.3.3': optional: true - '@rspack/binding-linux-arm64-musl@1.3.5': - optional: true - '@rspack/binding-linux-arm64-musl@1.3.7': optional: true @@ -10908,9 +10845,6 @@ snapshots: '@rspack/binding-linux-x64-gnu@1.3.3': optional: true - '@rspack/binding-linux-x64-gnu@1.3.5': - optional: true - '@rspack/binding-linux-x64-gnu@1.3.7': optional: true @@ -10920,9 +10854,6 @@ snapshots: '@rspack/binding-linux-x64-musl@1.3.3': optional: true - '@rspack/binding-linux-x64-musl@1.3.5': - optional: true - '@rspack/binding-linux-x64-musl@1.3.7': optional: true @@ -10932,9 +10863,6 @@ snapshots: '@rspack/binding-win32-arm64-msvc@1.3.3': optional: true - '@rspack/binding-win32-arm64-msvc@1.3.5': - optional: true - '@rspack/binding-win32-arm64-msvc@1.3.7': optional: true @@ -10944,9 +10872,6 @@ snapshots: '@rspack/binding-win32-ia32-msvc@1.3.3': optional: true - '@rspack/binding-win32-ia32-msvc@1.3.5': - optional: true - '@rspack/binding-win32-ia32-msvc@1.3.7': optional: true @@ -10956,9 +10881,6 @@ snapshots: '@rspack/binding-win32-x64-msvc@1.3.3': optional: true - '@rspack/binding-win32-x64-msvc@1.3.5': - optional: true - '@rspack/binding-win32-x64-msvc@1.3.7': optional: true @@ -10986,18 +10908,6 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.3.3 '@rspack/binding-win32-x64-msvc': 1.3.3 - '@rspack/binding@1.3.5': - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.3.5 - '@rspack/binding-darwin-x64': 1.3.5 - '@rspack/binding-linux-arm64-gnu': 1.3.5 - '@rspack/binding-linux-arm64-musl': 1.3.5 - '@rspack/binding-linux-x64-gnu': 1.3.5 - '@rspack/binding-linux-x64-musl': 1.3.5 - '@rspack/binding-win32-arm64-msvc': 1.3.5 - '@rspack/binding-win32-ia32-msvc': 1.3.5 - '@rspack/binding-win32-x64-msvc': 1.3.5 - '@rspack/binding@1.3.7': optionalDependencies: '@rspack/binding-darwin-arm64': 1.3.7 @@ -11015,7 +10925,7 @@ snapshots: '@module-federation/runtime-tools': 0.8.4 '@rspack/binding': 1.2.2 '@rspack/lite-tapable': 1.0.1 - caniuse-lite: 1.0.30001714 + caniuse-lite: 1.0.30001716 optionalDependencies: '@swc/helpers': 0.5.17 @@ -11024,16 +10934,7 @@ snapshots: '@module-federation/runtime-tools': 0.11.2 '@rspack/binding': 1.3.3 '@rspack/lite-tapable': 1.0.1 - caniuse-lite: 1.0.30001714 - optionalDependencies: - '@swc/helpers': 0.5.17 - - '@rspack/core@1.3.5(@swc/helpers@0.5.17)': - dependencies: - '@module-federation/runtime-tools': 0.11.2 - '@rspack/binding': 1.3.5 - '@rspack/lite-tapable': 1.0.1 - caniuse-lite: 1.0.30001714 + caniuse-lite: 1.0.30001716 optionalDependencies: '@swc/helpers': 0.5.17 @@ -12004,7 +11905,7 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001714 + caniuse-lite: 1.0.30001716 electron-to-chromium: 1.5.96 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -13354,6 +13255,8 @@ snapshots: hermes-estree@0.28.0: {} + hermes-estree@0.28.1: {} + hermes-parser@0.20.1: dependencies: hermes-estree: 0.20.1 @@ -13366,6 +13269,10 @@ snapshots: dependencies: hermes-estree: 0.28.0 + hermes-parser@0.28.1: + dependencies: + hermes-estree: 0.28.1 + highlight.js@10.7.3: {} highlightjs-vue@1.0.0: {} @@ -15663,14 +15570,14 @@ snapshots: optionalDependencies: postcss: 8.5.1 - postcss-loader@8.1.1(@rspack/core@1.3.5(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5): + postcss-loader@8.1.1(@rspack/core@1.3.7(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.1 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.3.5(@swc/helpers@0.5.17) + '@rspack/core': 1.3.7(@swc/helpers@0.5.17) webpack: 5.99.5 transitivePeerDependencies: - typescript diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d2ee15581..17d5f50c4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,7 @@ packages: - "website" catalog: - "@rspack/core": ^1.3.5 + "@rspack/core": ^1.3.6 "@rslib/core": ^0.6.3 "@swc/helpers": ~0.5.17 "@types/node": ^18 From 3b892ba3849f6c30e64c7aa48ba92caa5d7d150d Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 14 May 2025 15:58:01 +0200 Subject: [PATCH 02/61] chore: bump rspack to 1.3.10 --- pnpm-lock.yaml | 249 +++++++++++++++++++++++++++++++++++--------- pnpm-workspace.yaml | 2 +- 2 files changed, 202 insertions(+), 49 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1d558dffb..b4f44c5d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: ^0.6.3 version: 0.6.3 '@rspack/core': - specifier: ^1.3.6 - version: 1.3.7 + specifier: ^1.3.10 + version: 1.3.10 '@swc/helpers': specifier: ~0.5.17 version: 0.5.17 @@ -161,10 +161,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.11 - version: 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.7(@swc/helpers@0.5.17) + version: 1.3.10(@swc/helpers@0.5.17) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.8.3) @@ -194,7 +194,7 @@ importers: version: 8.5.1 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(@rspack/core@1.3.7(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5) + version: 8.1.1(@rspack/core@1.3.10(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5) react-native-test-app: specifier: catalog:testers version: 4.3.3(react-native@0.79.1(@babel/core@7.25.2)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@19.0.10)(react@19.0.0))(react@19.0.0) @@ -261,10 +261,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.7(@swc/helpers@0.5.17) + version: 1.3.10(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -294,7 +294,7 @@ importers: version: link:../../packages/repack '@module-federation/enhanced': specifier: 0.12.0 - version: 0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) + version: 0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) '@module-federation/runtime': specifier: 0.12.0 version: 0.12.0 @@ -340,10 +340,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.7(@swc/helpers@0.5.17) + version: 1.3.10(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -483,7 +483,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.7(@swc/helpers@0.5.17) + version: 1.3.10(@swc/helpers@0.5.17) '@types/node': specifier: 'catalog:' version: 18.19.41 @@ -499,7 +499,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.7(@swc/helpers@0.5.17) + version: 1.3.10(@swc/helpers@0.5.17) '@types/dedent': specifier: 0.7.2 version: 0.7.2 @@ -520,7 +520,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.7(@swc/helpers@0.5.17) + version: 1.3.10(@swc/helpers@0.5.17) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -617,13 +617,13 @@ importers: version: 7.24.8(@babel/core@7.25.2) '@module-federation/enhanced': specifier: 0.8.9 - version: 0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) + version: 0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) '@module-federation/sdk': specifier: 0.6.10 version: 0.6.10 '@rspack/core': specifier: 'catalog:' - version: 1.3.7(@swc/helpers@0.5.17) + version: 1.3.10(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -2199,6 +2199,9 @@ packages: '@module-federation/error-codes@0.13.0': resolution: {integrity: sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==} + '@module-federation/error-codes@0.13.1': + resolution: {integrity: sha512-azgGDBnFRfqlivHOl96ZjlFUFlukESz2Rnnz/pINiSqoBBNjUE0fcAZP4X6jgrVITuEg90YkruZa7pW9I3m7Uw==} + '@module-federation/error-codes@0.8.4': resolution: {integrity: sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==} @@ -2260,6 +2263,9 @@ packages: '@module-federation/runtime-core@0.13.0': resolution: {integrity: sha512-Oj/1p0mfxZ+8EbU7ND4gMvRmikFpIvPCbblOgat9N8ZIVAKYpTimCgMhzg4yRqAwzlGCVwnnW7XZ8UlA+Zqrvg==} + '@module-federation/runtime-core@0.13.1': + resolution: {integrity: sha512-TfyKfkSAentKeuvSsAItk8s5tqQSMfIRTPN2e1aoaq/kFhE+7blps719csyWSX5Lg5Es7WXKMsXHy40UgtBtuw==} + '@module-federation/runtime-core@0.6.17': resolution: {integrity: sha512-PXFN/TT9f64Un6NQYqH1Z0QLhpytW15jkZvTEOV8W7Ed319BECFI0Rv4xAsAGa8zJGFoaM/c7QOQfdFXtKj5Og==} @@ -2272,6 +2278,9 @@ packages: '@module-federation/runtime-tools@0.13.0': resolution: {integrity: sha512-6ECWX18yGrQKcmkrQoNPd5VEpxZP1SMaB/Bp55xlpEhsrpn4zHnriQluxDw6xldjSOLl1qbokfxwCwjS2OaEbg==} + '@module-federation/runtime-tools@0.13.1': + resolution: {integrity: sha512-GEF1pxqLc80osIMZmE8j9UKZSaTm2hX2lql8tgIH/O9yK4wnF06k6LL5Ah+wJt+oJv6Dj55ri/MoxMP4SXoPNA==} + '@module-federation/runtime-tools@0.8.4': resolution: {integrity: sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==} @@ -2287,6 +2296,9 @@ packages: '@module-federation/runtime@0.13.0': resolution: {integrity: sha512-Ne/3AEVWz6LL6G/i41O5MC6YYlg0SatNNqG/0XbuMAfyGM+llRmB6VKt0o2+JR4isxWuPNp97TbUkkfORit6Eg==} + '@module-federation/runtime@0.13.1': + resolution: {integrity: sha512-ZHnYvBquDm49LiHfv6fgagMo/cVJneijNJzfPh6S0CJrPS2Tay1bnTXzy8VA5sdIrESagYPaskKMGIj7YfnPug==} + '@module-federation/runtime@0.8.4': resolution: {integrity: sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==} @@ -2302,6 +2314,9 @@ packages: '@module-federation/sdk@0.13.0': resolution: {integrity: sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==} + '@module-federation/sdk@0.13.1': + resolution: {integrity: sha512-bmf2FGQ0ymZuxYnw9bIUfhV3y6zDhaqgydEjbl4msObKMLGXZqhse2pTIIxBFpIxR1oONKX/y2FAolDCTlWKiw==} + '@module-federation/sdk@0.6.10': resolution: {integrity: sha512-i6ofHnImB4zCn/bt7Ft0zh9o/PxvsJj8Wc88EAeJg4IrY6+bzwwo1G2h44w1Yt3go4skZZFQCK0UxoaV6l/t/A==} @@ -2326,6 +2341,9 @@ packages: '@module-federation/webpack-bundler-runtime@0.13.0': resolution: {integrity: sha512-ycgAsFeCTo+3GR8JxkhCyg2UZm6Au98ISdLTdVXYphO4UDcO/KjqyJen1LXEslkpCEohDj68Prei2fUHRruK6g==} + '@module-federation/webpack-bundler-runtime@0.13.1': + resolution: {integrity: sha512-QSuSIGa09S8mthbB1L6xERqrz+AzPlHR6D7RwAzssAc+IHf40U6NiTLPzUqp9mmKDhC5Tm0EISU0ZHNeJpnpBQ==} + '@module-federation/webpack-bundler-runtime@0.8.4': resolution: {integrity: sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==} @@ -2759,6 +2777,11 @@ packages: cpu: [arm64] os: [darwin] + '@rspack/binding-darwin-arm64@1.3.10': + resolution: {integrity: sha512-0k/j8OeMSVm5u5Nzckp9Ie7S7hprnvNegebnGr+L6VCyD7sMqm4m+4rLHs99ZklYdH0dZtY2+LrzrtjUZCqfew==} + cpu: [arm64] + os: [darwin] + '@rspack/binding-darwin-arm64@1.3.3': resolution: {integrity: sha512-vbzEdpRCZl5+HXWsVjzSDqB9ZVIlqldV+udHp4YDD8qiwdQznVaBZke0eMzZ7kaInqRPsZ+UHQuVk6JaH/JkMQ==} cpu: [arm64] @@ -2774,6 +2797,11 @@ packages: cpu: [x64] os: [darwin] + '@rspack/binding-darwin-x64@1.3.10': + resolution: {integrity: sha512-jOyqYW/18cgxw60wK5oqJvM194pbD4H99xaif89McNtLkH3npFvBkXBHVWWuOHGoXNX0LhRpHcI89p9b9THQZQ==} + cpu: [x64] + os: [darwin] + '@rspack/binding-darwin-x64@1.3.3': resolution: {integrity: sha512-OXtY2s4nlYtUXkeJt8TQKKNIcN7PI8yDq0nqI75OfJoS4u1ZmRXJ8IMeSALLo8I+xD2RAF79tf7yhM/Y/AaiKQ==} cpu: [x64] @@ -2789,6 +2817,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-gnu@1.3.10': + resolution: {integrity: sha512-zhF5ZNaT/7pxrm8xD3dWG1b4x+FO3LbVeZZG448CjpSo5T57kPD+SaGUU1GcPpn6mexf795x0SVS49aH7/e3Dg==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-arm64-gnu@1.3.3': resolution: {integrity: sha512-Lluq3RLYzyCMdXr/HyALKEPGsr+196x8Ccuy5AmIRosOdWuwtSiomSRH1Ka8REUFNHfYy5y9SzfmIZo/E0QEmg==} cpu: [arm64] @@ -2804,6 +2837,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-musl@1.3.10': + resolution: {integrity: sha512-o3x7IrOSCHK6lcRvdZgsSuOG1CHRQR00xiyLW7kkWmNm7t417LC9xdFWKIK62C5fKXGC5YcTbUkDMnQujespkg==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-arm64-musl@1.3.3': resolution: {integrity: sha512-PIsicXWjOqzmoOutUqxpMNkCoKo+8/wxDyKxHFeu+5WIAxVFphe2d3H5qvEjc2MasWSdRmAVn9XiuIj2LIXFzA==} cpu: [arm64] @@ -2819,6 +2857,11 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-gnu@1.3.10': + resolution: {integrity: sha512-FMSi28VZhXMr15picOHFynULhqZ/FODPxRIS6uNrvPRYcbNuiO1v+VHV6X88mhOMmJ/aVF6OwjUO/o2l1FVa9Q==} + cpu: [x64] + os: [linux] + '@rspack/binding-linux-x64-gnu@1.3.3': resolution: {integrity: sha512-BtksK73ZFdny2T/wU1x0kxBF4ruYUUArZDyeGfpO+vd/1nNYqzzdhGvOksKmtdvsO38ETr2gZ9+XZyr1vpy9uQ==} cpu: [x64] @@ -2834,6 +2877,11 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-musl@1.3.10': + resolution: {integrity: sha512-e0xbY9SlbRGIFz41v1yc0HfREvmgMnLV1bLmTSPK8wI2suIEJ7iYYqsocHOAOk86qLZcxVrTnL6EjUcNaRTWlg==} + cpu: [x64] + os: [linux] + '@rspack/binding-linux-x64-musl@1.3.3': resolution: {integrity: sha512-jx86CxkTmyBz/eHDqZp1mCqBwY+UTEtaPlPoWFyGkJUR5ey6nQnxS+fhG34Rqz63chW+q/afwpGNGyALYdgc8g==} cpu: [x64] @@ -2849,6 +2897,11 @@ packages: cpu: [arm64] os: [win32] + '@rspack/binding-win32-arm64-msvc@1.3.10': + resolution: {integrity: sha512-YHJPvEujWeWjU6EUF6sDpaec9rsOtKVvy16YCtGaxRpDQXqfuxibnp6Ge0ZTTrY+joRiWehRA9OUI+3McqI+QA==} + cpu: [arm64] + os: [win32] + '@rspack/binding-win32-arm64-msvc@1.3.3': resolution: {integrity: sha512-uXAdDzajFToVrH3fCNVDP/uKQ9i5FQjJc2aYxsnhS9Su/CZB+UQsOecbq6MnIN2s0B9GBKBG8QdQEtS3RtC6Hg==} cpu: [arm64] @@ -2864,6 +2917,11 @@ packages: cpu: [ia32] os: [win32] + '@rspack/binding-win32-ia32-msvc@1.3.10': + resolution: {integrity: sha512-2iwSBzVBC89ZSk56MYwgirh3bda2WKmL9I3qPajiTEivChXpX7jp83jAtGE6CPqPYcccYz6nrURTHNUZhqXxVw==} + cpu: [ia32] + os: [win32] + '@rspack/binding-win32-ia32-msvc@1.3.3': resolution: {integrity: sha512-VBE6XsJ3IiAlozAywAIxAZ1Aqc2QVnEwBo0gP9998KkwL7wxB6Bg/OJnPbH3Q0ZaNWAQViC99rPC+5hSIdeSxw==} cpu: [ia32] @@ -2879,6 +2937,11 @@ packages: cpu: [x64] os: [win32] + '@rspack/binding-win32-x64-msvc@1.3.10': + resolution: {integrity: sha512-ehWJ9Y5Zezj/+uJpiWbt29RZaRIM00f91PWuabM6/sKmHJhdCEE21u5iI3B8DeW/EjJsH8zkI69YYAxJWwGn9A==} + cpu: [x64] + os: [win32] + '@rspack/binding-win32-x64-msvc@1.3.3': resolution: {integrity: sha512-rOsNz4/DFgSENjEh0t9kFn89feuXK14/9wbmmFlT8VMpYOCcj4tKcAHjWg+Nzzj4FL+NSOC/81SrUF9J+C2R7w==} cpu: [x64] @@ -2892,6 +2955,9 @@ packages: '@rspack/binding@1.2.2': resolution: {integrity: sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==} + '@rspack/binding@1.3.10': + resolution: {integrity: sha512-9TjO+Ig5U4VqdYWpBsv01n4d2KsgFfdXGIE7zdHXDDbry0avL0J4109ESqSeP9uC+Bi7ZCF53iaxJRvZDflNVQ==} + '@rspack/binding@1.3.3': resolution: {integrity: sha512-zdwJ801tyC8k+Gu5RjNoc7bEtX0MgJzzVv9qpaMwcAUfUfwZgCzXPTqcGMDoNI+Z47Fw59/2fKCmgZhZn60AgA==} @@ -2910,6 +2976,15 @@ packages: '@swc/helpers': optional: true + '@rspack/core@1.3.10': + resolution: {integrity: sha512-YomvSRGuMUQgCE2rNMdff2q1Z0YpZw/z6m5+PVTMSs9l/q69YKUzpbpSD8YyB5i1DddrRxC2RE34DkrBuwlREQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@rspack/core@1.3.3': resolution: {integrity: sha512-+mXVlFcYr0tWezZfJ/gR0fj8njRc7pzEMtTFa2NO5cfsNAKPF/SXm4rb55kfa63r0b3U3N7f2nKrJG9wyG7zMQ==} engines: {node: '>=16.0.0'} @@ -3809,6 +3884,9 @@ packages: caniuse-lite@1.0.30001716: resolution: {integrity: sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==} + caniuse-lite@1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -9896,7 +9974,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': + '@module-federation/enhanced@0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/cli': 0.12.0(typescript@5.8.3) @@ -9906,7 +9984,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.12.0(@module-federation/runtime-tools@0.12.0) '@module-federation/managers': 0.12.0 '@module-federation/manifest': 0.12.0(typescript@5.8.3) - '@module-federation/rspack': 0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 btoa: 1.2.1 @@ -9924,7 +10002,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': + '@module-federation/enhanced@0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/data-prefetch': 0.8.9(react-dom@19.1.0(react@19.0.0))(react@19.0.0) @@ -9933,7 +10011,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.8.9(@module-federation/runtime-tools@0.8.9) '@module-federation/managers': 0.8.9 '@module-federation/manifest': 0.8.9(typescript@5.8.3) - '@module-federation/rspack': 0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 btoa: 1.2.1 @@ -9956,6 +10034,8 @@ snapshots: '@module-federation/error-codes@0.13.0': {} + '@module-federation/error-codes@0.13.1': {} + '@module-federation/error-codes@0.8.4': {} '@module-federation/error-codes@0.8.9': {} @@ -10010,7 +10090,7 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/rspack@0.12.0(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/dts-plugin': 0.12.0(typescript@5.8.3) @@ -10019,7 +10099,7 @@ snapshots: '@module-federation/manifest': 0.12.0(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 - '@rspack/core': 1.3.7(@swc/helpers@0.5.17) + '@rspack/core': 1.3.10(@swc/helpers@0.5.17) btoa: 1.2.1 optionalDependencies: typescript: 5.8.3 @@ -10029,7 +10109,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/rspack@0.8.9(@rspack/core@1.3.7(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/dts-plugin': 0.8.9(typescript@5.8.3) @@ -10038,7 +10118,7 @@ snapshots: '@module-federation/manifest': 0.8.9(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 - '@rspack/core': 1.3.7(@swc/helpers@0.5.17) + '@rspack/core': 1.3.10(@swc/helpers@0.5.17) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10062,6 +10142,11 @@ snapshots: '@module-federation/error-codes': 0.13.0 '@module-federation/sdk': 0.13.0 + '@module-federation/runtime-core@0.13.1': + dependencies: + '@module-federation/error-codes': 0.13.1 + '@module-federation/sdk': 0.13.1 + '@module-federation/runtime-core@0.6.17': dependencies: '@module-federation/error-codes': 0.8.9 @@ -10082,6 +10167,11 @@ snapshots: '@module-federation/runtime': 0.13.0 '@module-federation/webpack-bundler-runtime': 0.13.0 + '@module-federation/runtime-tools@0.13.1': + dependencies: + '@module-federation/runtime': 0.13.1 + '@module-federation/webpack-bundler-runtime': 0.13.1 + '@module-federation/runtime-tools@0.8.4': dependencies: '@module-federation/runtime': 0.8.4 @@ -10110,6 +10200,12 @@ snapshots: '@module-federation/runtime-core': 0.13.0 '@module-federation/sdk': 0.13.0 + '@module-federation/runtime@0.13.1': + dependencies: + '@module-federation/error-codes': 0.13.1 + '@module-federation/runtime-core': 0.13.1 + '@module-federation/sdk': 0.13.1 + '@module-federation/runtime@0.8.4': dependencies: '@module-federation/error-codes': 0.8.4 @@ -10127,6 +10223,8 @@ snapshots: '@module-federation/sdk@0.13.0': {} + '@module-federation/sdk@0.13.1': {} + '@module-federation/sdk@0.6.10': {} '@module-federation/sdk@0.8.4': @@ -10164,6 +10262,11 @@ snapshots: '@module-federation/runtime': 0.13.0 '@module-federation/sdk': 0.13.0 + '@module-federation/webpack-bundler-runtime@0.13.1': + dependencies: + '@module-federation/runtime': 0.13.1 + '@module-federation/sdk': 0.13.1 + '@module-federation/webpack-bundler-runtime@0.8.4': dependencies: '@module-federation/runtime': 0.8.4 @@ -10680,12 +10783,12 @@ snapshots: '@rsdoctor/client@0.4.11': {} - '@rsdoctor/core@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/core@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) axios: 1.8.4 enhanced-resolve: 5.12.0 filesize: 10.1.6 @@ -10703,10 +10806,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/graph@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) lodash: 4.17.21 socket.io: 4.7.2 source-map: 0.7.4 @@ -10717,14 +10820,14 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/core': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rspack/core': 1.3.7(@swc/helpers@0.5.17) + '@rsdoctor/core': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rspack/core': 1.3.10(@swc/helpers@0.5.17) lodash: 4.17.21 transitivePeerDependencies: - bufferutil @@ -10733,12 +10836,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/sdk@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@rsdoctor/client': 0.4.11 - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -10758,7 +10861,7 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/types@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 @@ -10766,12 +10869,12 @@ snapshots: source-map: 0.7.4 webpack: 5.99.5 optionalDependencies: - '@rspack/core': 1.3.7(@swc/helpers@0.5.17) + '@rspack/core': 1.3.10(@swc/helpers@0.5.17) - '@rsdoctor/utils@0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/utils@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@babel/code-frame': 7.25.7 - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.7(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) '@types/estree': 1.0.5 acorn: 8.14.0 acorn-import-assertions: 1.9.0(acorn@8.14.0) @@ -10806,6 +10909,9 @@ snapshots: '@rspack/binding-darwin-arm64@1.2.2': optional: true + '@rspack/binding-darwin-arm64@1.3.10': + optional: true + '@rspack/binding-darwin-arm64@1.3.3': optional: true @@ -10815,6 +10921,9 @@ snapshots: '@rspack/binding-darwin-x64@1.2.2': optional: true + '@rspack/binding-darwin-x64@1.3.10': + optional: true + '@rspack/binding-darwin-x64@1.3.3': optional: true @@ -10824,6 +10933,9 @@ snapshots: '@rspack/binding-linux-arm64-gnu@1.2.2': optional: true + '@rspack/binding-linux-arm64-gnu@1.3.10': + optional: true + '@rspack/binding-linux-arm64-gnu@1.3.3': optional: true @@ -10833,6 +10945,9 @@ snapshots: '@rspack/binding-linux-arm64-musl@1.2.2': optional: true + '@rspack/binding-linux-arm64-musl@1.3.10': + optional: true + '@rspack/binding-linux-arm64-musl@1.3.3': optional: true @@ -10842,6 +10957,9 @@ snapshots: '@rspack/binding-linux-x64-gnu@1.2.2': optional: true + '@rspack/binding-linux-x64-gnu@1.3.10': + optional: true + '@rspack/binding-linux-x64-gnu@1.3.3': optional: true @@ -10851,6 +10969,9 @@ snapshots: '@rspack/binding-linux-x64-musl@1.2.2': optional: true + '@rspack/binding-linux-x64-musl@1.3.10': + optional: true + '@rspack/binding-linux-x64-musl@1.3.3': optional: true @@ -10860,6 +10981,9 @@ snapshots: '@rspack/binding-win32-arm64-msvc@1.2.2': optional: true + '@rspack/binding-win32-arm64-msvc@1.3.10': + optional: true + '@rspack/binding-win32-arm64-msvc@1.3.3': optional: true @@ -10869,6 +10993,9 @@ snapshots: '@rspack/binding-win32-ia32-msvc@1.2.2': optional: true + '@rspack/binding-win32-ia32-msvc@1.3.10': + optional: true + '@rspack/binding-win32-ia32-msvc@1.3.3': optional: true @@ -10878,6 +11005,9 @@ snapshots: '@rspack/binding-win32-x64-msvc@1.2.2': optional: true + '@rspack/binding-win32-x64-msvc@1.3.10': + optional: true + '@rspack/binding-win32-x64-msvc@1.3.3': optional: true @@ -10896,6 +11026,18 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.2.2 '@rspack/binding-win32-x64-msvc': 1.2.2 + '@rspack/binding@1.3.10': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.3.10 + '@rspack/binding-darwin-x64': 1.3.10 + '@rspack/binding-linux-arm64-gnu': 1.3.10 + '@rspack/binding-linux-arm64-musl': 1.3.10 + '@rspack/binding-linux-x64-gnu': 1.3.10 + '@rspack/binding-linux-x64-musl': 1.3.10 + '@rspack/binding-win32-arm64-msvc': 1.3.10 + '@rspack/binding-win32-ia32-msvc': 1.3.10 + '@rspack/binding-win32-x64-msvc': 1.3.10 + '@rspack/binding@1.3.3': optionalDependencies: '@rspack/binding-darwin-arm64': 1.3.3 @@ -10929,6 +11071,15 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 + '@rspack/core@1.3.10(@swc/helpers@0.5.17)': + dependencies: + '@module-federation/runtime-tools': 0.13.1 + '@rspack/binding': 1.3.10 + '@rspack/lite-tapable': 1.0.1 + caniuse-lite: 1.0.30001718 + optionalDependencies: + '@swc/helpers': 0.5.17 + '@rspack/core@1.3.3(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.11.2 @@ -11975,6 +12126,8 @@ snapshots: caniuse-lite@1.0.30001716: {} + caniuse-lite@1.0.30001718: {} + ccount@2.0.1: {} chai@5.1.1: @@ -15570,14 +15723,14 @@ snapshots: optionalDependencies: postcss: 8.5.1 - postcss-loader@8.1.1(@rspack/core@1.3.7(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5): + postcss-loader@8.1.1(@rspack/core@1.3.10(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.1 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.3.7(@swc/helpers@0.5.17) + '@rspack/core': 1.3.10(@swc/helpers@0.5.17) webpack: 5.99.5 transitivePeerDependencies: - typescript diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 17d5f50c4..888a9a57b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,7 @@ packages: - "website" catalog: - "@rspack/core": ^1.3.6 + "@rspack/core": ^1.3.10 "@rslib/core": ^0.6.3 "@swc/helpers": ~0.5.17 "@types/node": ^18 From 0c4ed40d659f246e06df988de4fc7fe685de4032 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 14 May 2025 15:58:26 +0200 Subject: [PATCH 03/61] feat: preset --- apps/tester-app/babel.config.js | 23 ------------- apps/tester-app/rspack.config.mjs | 4 ++- .../src/loaders/babelLoader/babelLoader.ts | 20 ++++++++--- .../repack/src/loaders/babelLoader/options.ts | 26 +++++++++++++++ .../repack/src/loaders/babelLoader/preset.ts | 33 +++++++++++++++++++ 5 files changed, 77 insertions(+), 29 deletions(-) create mode 100644 packages/repack/src/loaders/babelLoader/options.ts create mode 100644 packages/repack/src/loaders/babelLoader/preset.ts diff --git a/apps/tester-app/babel.config.js b/apps/tester-app/babel.config.js index 687e94209..c8d21ba87 100644 --- a/apps/tester-app/babel.config.js +++ b/apps/tester-app/babel.config.js @@ -1,32 +1,9 @@ module.exports = { plugins: [ - '@babel/plugin-syntax-typescript', - '@react-native/babel-plugin-codegen', - '@babel/plugin-transform-flow-strip-types', [ '@babel/plugin-transform-react-jsx', { runtime: 'automatic', importSource: 'nativewind' }, ], 'react-native-reanimated/plugin', ], - overrides: [ - { - test: /\.ts$/, - plugins: [ - [ - '@babel/plugin-syntax-typescript', - { isTSX: false, allowNamespaces: true }, - ], - ], - }, - { - test: /\.tsx$/, - plugins: [ - [ - '@babel/plugin-syntax-typescript', - { isTSX: true, allowNamespaces: true }, - ], - ], - }, - ], }; diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 5e373f8e1..6553f2402 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -43,7 +43,9 @@ export default (env) => { use: { loader: '@callstack/repack/babel-loader', parallel: true, - options: {}, + options: { + projectRoot: context, + }, }, type: 'javascript/auto', }, diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 63cf082e7..a17d2d8aa 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -10,6 +10,8 @@ import { import * as hermesParser from 'hermes-parser'; import type { LoaderContext } from '@rspack/core'; +import { type BabelLoaderOptions, getOptions } from './options.js'; +import { repackBabelPreset } from './preset.js'; export const raw = false; @@ -71,7 +73,6 @@ const getBabelRC = (() => { } // If we found a babel config file, extend our config off of it - // otherwise the default config will be used if (fs.existsSync(projectBabelRCPath)) { babelRC.extends = projectBabelRCPath; } @@ -92,8 +93,11 @@ function buildBabelConfig( code: true, cwd: options.projectRoot, filename, - highlightCode: false, + highlightCode: true, compact: false, + comments: true, + minified: false, + presets: [repackBabelPreset], }; return { ...babelRC, ...extraConfig }; @@ -108,9 +112,10 @@ const transform = ({ options: CustomOptions; src: string; }) => { + const builtConfig = buildBabelConfig(filename, options); const babelConfig: TransformOptions = { sourceType: 'unambiguous', - ...buildBabelConfig(filename, options), + ...builtConfig, caller: { name: 'repack' }, ast: false, cloneInputAst: false, @@ -129,9 +134,13 @@ const transform = ({ return transformFromAstSync(sourceAst, src, babelConfig); }; -export default function babelLoader(this: LoaderContext, source: string) { +export default function babelLoader( + this: LoaderContext, + source: string +) { this.cacheable(); const callback = this.async(); + const options = getOptions(this); try { const result = transform({ @@ -140,7 +149,8 @@ export default function babelLoader(this: LoaderContext, source: string) { options: { enableBabelRCLookup: true, // this is currently broken in Rspack and needs to be fixed upstream - projectRoot: this.rootContext, + // for now we can pass this as an option to loader + projectRoot: options.projectRoot, }, }); // @ts-ignore diff --git a/packages/repack/src/loaders/babelLoader/options.ts b/packages/repack/src/loaders/babelLoader/options.ts new file mode 100644 index 000000000..7582c14b1 --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/options.ts @@ -0,0 +1,26 @@ +import type { LoaderContext } from '@rspack/core'; +import type { validate } from 'schema-utils'; + +export interface BabelLoaderOptions { + projectRoot: string; +} + +type Schema = Parameters[0]; + +export const optionsSchema: Schema = { + type: 'object', + required: ['projectRoot'], + properties: { + projectRoot: { type: 'string' }, + }, +}; + +export function getOptions( + loaderContext: LoaderContext +): BabelLoaderOptions { + const options = loaderContext.getOptions(loaderContext) || {}; + + // validate(optionsSchema, options, { name: 'repackBabelLoader' }); + + return options; +} diff --git a/packages/repack/src/loaders/babelLoader/preset.ts b/packages/repack/src/loaders/babelLoader/preset.ts new file mode 100644 index 000000000..abf505523 --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/preset.ts @@ -0,0 +1,33 @@ +import type { TransformOptions } from '@babel/core'; + +export const repackBabelPreset: TransformOptions = { + plugins: [ + ['@babel/plugin-syntax-typescript', false], + ['@react-native/babel-plugin-codegen', false], + '@babel/plugin-transform-flow-strip-types', + ], + overrides: [ + { + test: /(?:^|[\\/])(?:Native\w+|(\w+)NativeComponent)\.[jt]sx?$/, + plugins: ['@react-native/babel-plugin-codegen'], + }, + { + test: /\.ts$/, + plugins: [ + [ + '@babel/plugin-syntax-typescript', + { isTSX: false, allowNamespaces: true }, + ], + ], + }, + { + test: /\.tsx$/, + plugins: [ + [ + '@babel/plugin-syntax-typescript', + { isTSX: true, allowNamespaces: true }, + ], + ], + }, + ], +}; From 53130dbed5e3321eb65685a26ef315c81b1f1c8b Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 2 Jul 2025 19:10:37 +0200 Subject: [PATCH 04/61] chore: bump rspack --- pnpm-lock.yaml | 392 +++++++++++++++++++++++--------------------- pnpm-workspace.yaml | 2 +- 2 files changed, 204 insertions(+), 190 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9f842da2..38d7de34a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: ^0.6.3 version: 0.6.3 '@rspack/core': - specifier: ^1.3.10 - version: 1.3.10 + specifier: ^1.4.2 + version: 1.4.2 '@swc/helpers': specifier: ~0.5.17 version: 0.5.17 @@ -164,10 +164,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.11 - version: 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.10(@swc/helpers@0.5.17) + version: 1.4.2(@swc/helpers@0.5.17) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.8.3) @@ -197,7 +197,7 @@ importers: version: 8.5.1 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(@rspack/core@1.3.10(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5) + version: 8.1.1(@rspack/core@1.4.2(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5) react-native-test-app: specifier: catalog:testers version: 4.3.3(react-native@0.79.1(@babel/core@7.25.2)(@react-native-community/cli@18.0.0(typescript@5.8.3))(@types/react@19.0.10)(react@19.0.0))(react@19.0.0) @@ -264,10 +264,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.10(@swc/helpers@0.5.17) + version: 1.4.2(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -297,7 +297,7 @@ importers: version: link:../../packages/repack '@module-federation/enhanced': specifier: 0.12.0 - version: 0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) + version: 0.12.0(@rspack/core@1.4.2(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) '@module-federation/runtime': specifier: 0.12.0 version: 0.12.0 @@ -343,10 +343,10 @@ importers: version: 0.79.1 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + version: 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) '@rspack/core': specifier: 'catalog:' - version: 1.3.10(@swc/helpers@0.5.17) + version: 1.4.2(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -486,7 +486,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.10(@swc/helpers@0.5.17) + version: 1.4.2(@swc/helpers@0.5.17) '@types/node': specifier: 'catalog:' version: 18.19.41 @@ -502,7 +502,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.10(@swc/helpers@0.5.17) + version: 1.4.2(@swc/helpers@0.5.17) '@types/dedent': specifier: 0.7.2 version: 0.7.2 @@ -523,7 +523,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.3.10(@swc/helpers@0.5.17) + version: 1.4.2(@swc/helpers@0.5.17) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -620,13 +620,13 @@ importers: version: 7.24.8(@babel/core@7.25.2) '@module-federation/enhanced': specifier: 0.8.9 - version: 0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) + version: 0.8.9(@rspack/core@1.4.2(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5) '@module-federation/sdk': specifier: 0.6.10 version: 0.6.10 '@rspack/core': specifier: 'catalog:' - version: 1.3.10(@swc/helpers@0.5.17) + version: 1.4.2(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -1665,14 +1665,14 @@ packages: peerDependencies: react: '19' - '@emnapi/core@1.2.0': - resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==} + '@emnapi/core@1.4.3': + resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@emnapi/wasi-threads@1.0.2': + resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} @@ -2226,8 +2226,8 @@ packages: '@module-federation/error-codes@0.13.0': resolution: {integrity: sha512-4soAMLr7qcVWuvCsyRmBbiBfuhxmnDeyl+qzjMx8VurQgL+XQDQJapM9RXngNGT4g8FoCq9o7rM5YWNgFFNUiw==} - '@module-federation/error-codes@0.13.1': - resolution: {integrity: sha512-azgGDBnFRfqlivHOl96ZjlFUFlukESz2Rnnz/pINiSqoBBNjUE0fcAZP4X6jgrVITuEg90YkruZa7pW9I3m7Uw==} + '@module-federation/error-codes@0.15.0': + resolution: {integrity: sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg==} '@module-federation/error-codes@0.8.4': resolution: {integrity: sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==} @@ -2290,8 +2290,8 @@ packages: '@module-federation/runtime-core@0.13.0': resolution: {integrity: sha512-Oj/1p0mfxZ+8EbU7ND4gMvRmikFpIvPCbblOgat9N8ZIVAKYpTimCgMhzg4yRqAwzlGCVwnnW7XZ8UlA+Zqrvg==} - '@module-federation/runtime-core@0.13.1': - resolution: {integrity: sha512-TfyKfkSAentKeuvSsAItk8s5tqQSMfIRTPN2e1aoaq/kFhE+7blps719csyWSX5Lg5Es7WXKMsXHy40UgtBtuw==} + '@module-federation/runtime-core@0.15.0': + resolution: {integrity: sha512-RYzI61fRDrhyhaEOXH3AgIGlHiot0wPFXu7F43cr+ZnTi+VlSYWLdlZ4NBuT9uV6JSmH54/c+tEZm5SXgKR2sQ==} '@module-federation/runtime-core@0.6.17': resolution: {integrity: sha512-PXFN/TT9f64Un6NQYqH1Z0QLhpytW15jkZvTEOV8W7Ed319BECFI0Rv4xAsAGa8zJGFoaM/c7QOQfdFXtKj5Og==} @@ -2305,8 +2305,8 @@ packages: '@module-federation/runtime-tools@0.13.0': resolution: {integrity: sha512-6ECWX18yGrQKcmkrQoNPd5VEpxZP1SMaB/Bp55xlpEhsrpn4zHnriQluxDw6xldjSOLl1qbokfxwCwjS2OaEbg==} - '@module-federation/runtime-tools@0.13.1': - resolution: {integrity: sha512-GEF1pxqLc80osIMZmE8j9UKZSaTm2hX2lql8tgIH/O9yK4wnF06k6LL5Ah+wJt+oJv6Dj55ri/MoxMP4SXoPNA==} + '@module-federation/runtime-tools@0.15.0': + resolution: {integrity: sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA==} '@module-federation/runtime-tools@0.8.4': resolution: {integrity: sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==} @@ -2323,8 +2323,8 @@ packages: '@module-federation/runtime@0.13.0': resolution: {integrity: sha512-Ne/3AEVWz6LL6G/i41O5MC6YYlg0SatNNqG/0XbuMAfyGM+llRmB6VKt0o2+JR4isxWuPNp97TbUkkfORit6Eg==} - '@module-federation/runtime@0.13.1': - resolution: {integrity: sha512-ZHnYvBquDm49LiHfv6fgagMo/cVJneijNJzfPh6S0CJrPS2Tay1bnTXzy8VA5sdIrESagYPaskKMGIj7YfnPug==} + '@module-federation/runtime@0.15.0': + resolution: {integrity: sha512-dTPsCNum9Bhu3yPOcrPYq0YnM9eCMMMNB1wuiqf1+sFbQlNApF0vfZxooqz3ln0/MpgE0jerVvFsLVGfqvC9Ug==} '@module-federation/runtime@0.8.4': resolution: {integrity: sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==} @@ -2341,8 +2341,8 @@ packages: '@module-federation/sdk@0.13.0': resolution: {integrity: sha512-JdMZaPD+EQvMJYS+/8/8QjaAHQ3qljogvioXBsAuedcStu/msn5e1Fswc0G34kXY9ixs2hUPZU2cAllfSKWIBQ==} - '@module-federation/sdk@0.13.1': - resolution: {integrity: sha512-bmf2FGQ0ymZuxYnw9bIUfhV3y6zDhaqgydEjbl4msObKMLGXZqhse2pTIIxBFpIxR1oONKX/y2FAolDCTlWKiw==} + '@module-federation/sdk@0.15.0': + resolution: {integrity: sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw==} '@module-federation/sdk@0.6.10': resolution: {integrity: sha512-i6ofHnImB4zCn/bt7Ft0zh9o/PxvsJj8Wc88EAeJg4IrY6+bzwwo1G2h44w1Yt3go4skZZFQCK0UxoaV6l/t/A==} @@ -2368,8 +2368,8 @@ packages: '@module-federation/webpack-bundler-runtime@0.13.0': resolution: {integrity: sha512-ycgAsFeCTo+3GR8JxkhCyg2UZm6Au98ISdLTdVXYphO4UDcO/KjqyJen1LXEslkpCEohDj68Prei2fUHRruK6g==} - '@module-federation/webpack-bundler-runtime@0.13.1': - resolution: {integrity: sha512-QSuSIGa09S8mthbB1L6xERqrz+AzPlHR6D7RwAzssAc+IHf40U6NiTLPzUqp9mmKDhC5Tm0EISU0ZHNeJpnpBQ==} + '@module-federation/webpack-bundler-runtime@0.15.0': + resolution: {integrity: sha512-i+3wu2Ljh2TmuUpsnjwZVupOVqV50jP0ndA8PSP4gwMKlgdGeaZ4VH5KkHAXGr2eiYUxYLMrJXz1+eILJqeGDg==} '@module-federation/webpack-bundler-runtime@0.8.4': resolution: {integrity: sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==} @@ -2377,6 +2377,9 @@ packages: '@module-federation/webpack-bundler-runtime@0.8.9': resolution: {integrity: sha512-DYLvVi4b2MUYu/B4g5wIC5SHxiODboKHkYGHYapOhCcqOchca/N16gtiAI8eSNjJPc+fgUXUGIyGiB18IlFEeQ==} + '@napi-rs/wasm-runtime@0.2.11': + resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} @@ -2804,11 +2807,6 @@ packages: cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-arm64@1.3.10': - resolution: {integrity: sha512-0k/j8OeMSVm5u5Nzckp9Ie7S7hprnvNegebnGr+L6VCyD7sMqm4m+4rLHs99ZklYdH0dZtY2+LrzrtjUZCqfew==} - cpu: [arm64] - os: [darwin] - '@rspack/binding-darwin-arm64@1.3.3': resolution: {integrity: sha512-vbzEdpRCZl5+HXWsVjzSDqB9ZVIlqldV+udHp4YDD8qiwdQznVaBZke0eMzZ7kaInqRPsZ+UHQuVk6JaH/JkMQ==} cpu: [arm64] @@ -2819,13 +2817,13 @@ packages: cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.2.2': - resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} - cpu: [x64] + '@rspack/binding-darwin-arm64@1.4.2': + resolution: {integrity: sha512-0fPOew7D0l/x6qFZYdyUqutbw15K98VLvES2/7x2LPssTgypE4rVmnQSmVBnge3Nr8Qs/9qASPRpMWXBaqMfOA==} + cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.3.10': - resolution: {integrity: sha512-jOyqYW/18cgxw60wK5oqJvM194pbD4H99xaif89McNtLkH3npFvBkXBHVWWuOHGoXNX0LhRpHcI89p9b9THQZQ==} + '@rspack/binding-darwin-x64@1.2.2': + resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} cpu: [x64] os: [darwin] @@ -2839,16 +2837,16 @@ packages: cpu: [x64] os: [darwin] + '@rspack/binding-darwin-x64@1.4.2': + resolution: {integrity: sha512-0Dh6ssGgwnd9G+IO8SwQaJ0RJ8NkQbk4hwoJH/u52Mnfl0EvhmNvuhkbSEoKn1U3kElOA2cxH/3gbYzuYExn3g==} + cpu: [x64] + os: [darwin] + '@rspack/binding-linux-arm64-gnu@1.2.2': resolution: {integrity: sha512-VykY/kiYOzO8E1nYzfJ9+gQEHxb5B6lt5wa8M6xFi5B6jEGU+OsaGskmAZB9/GFImeFDHxDPvhUalI4R9p8O2Q==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-gnu@1.3.10': - resolution: {integrity: sha512-zhF5ZNaT/7pxrm8xD3dWG1b4x+FO3LbVeZZG448CjpSo5T57kPD+SaGUU1GcPpn6mexf795x0SVS49aH7/e3Dg==} - cpu: [arm64] - os: [linux] - '@rspack/binding-linux-arm64-gnu@1.3.3': resolution: {integrity: sha512-Lluq3RLYzyCMdXr/HyALKEPGsr+196x8Ccuy5AmIRosOdWuwtSiomSRH1Ka8REUFNHfYy5y9SzfmIZo/E0QEmg==} cpu: [arm64] @@ -2859,13 +2857,13 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.2.2': - resolution: {integrity: sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==} + '@rspack/binding-linux-arm64-gnu@1.4.2': + resolution: {integrity: sha512-UHAzggS8Mc7b3Xguhj82HwujLqBZquCeo8qJj5XreNaMKGb6YRw/91dJOVmkNiLCB0bj71CRE1Cocd+Peq3N9A==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.3.10': - resolution: {integrity: sha512-o3x7IrOSCHK6lcRvdZgsSuOG1CHRQR00xiyLW7kkWmNm7t417LC9xdFWKIK62C5fKXGC5YcTbUkDMnQujespkg==} + '@rspack/binding-linux-arm64-musl@1.2.2': + resolution: {integrity: sha512-Z5vAC4wGfXi8XXZ6hs8Q06TYjr3zHf819HB4DI5i4C1eQTeKdZSyoFD0NHFG23bP4NWJffp8KhmoObcy9jBT5Q==} cpu: [arm64] os: [linux] @@ -2879,13 +2877,13 @@ packages: cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.2.2': - resolution: {integrity: sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==} - cpu: [x64] + '@rspack/binding-linux-arm64-musl@1.4.2': + resolution: {integrity: sha512-QybZ0VxlFih+upLoE7Le5cN3LpxJwk6EnEQTigmzpfc4c4SOC889ftBoIAO3IeBk+mF3H2C9xD+/NolTdwoeiw==} + cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.3.10': - resolution: {integrity: sha512-FMSi28VZhXMr15picOHFynULhqZ/FODPxRIS6uNrvPRYcbNuiO1v+VHV6X88mhOMmJ/aVF6OwjUO/o2l1FVa9Q==} + '@rspack/binding-linux-x64-gnu@1.2.2': + resolution: {integrity: sha512-o3pDaL+cH5EeRbDE9gZcdZpBgp5iXvYZBBhe8vZQllYgI4zN5MJEuleV7WplG3UwTXlgZg3Kht4RORSOPn96vg==} cpu: [x64] os: [linux] @@ -2899,13 +2897,13 @@ packages: cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.2.2': - resolution: {integrity: sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==} + '@rspack/binding-linux-x64-gnu@1.4.2': + resolution: {integrity: sha512-ucCCWdtH1tekZadrsYj6GNJ8EP21BM2uSE7MootbwLw8aBtgVTKUuRDQEps1h/rtrdthzd9XBX6Lc2N926gM+g==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.3.10': - resolution: {integrity: sha512-e0xbY9SlbRGIFz41v1yc0HfREvmgMnLV1bLmTSPK8wI2suIEJ7iYYqsocHOAOk86qLZcxVrTnL6EjUcNaRTWlg==} + '@rspack/binding-linux-x64-musl@1.2.2': + resolution: {integrity: sha512-RE3e0xe4DdchHssttKzryDwjLkbrNk/4H59TkkWeGYJcLw41tmcOZVFQUOwKLUvXWVyif/vjvV/w1SMlqB4wQg==} cpu: [x64] os: [linux] @@ -2919,16 +2917,20 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-musl@1.4.2': + resolution: {integrity: sha512-+Y2LS6Qyk2AZor8DqlA8yKCqElYr0Urjc3M66O4ZzlxDT5xXX0J2vp04AtFp0g81q/+UgV3cbC//dqDvO0SiBA==} + cpu: [x64] + os: [linux] + + '@rspack/binding-wasm32-wasi@1.4.2': + resolution: {integrity: sha512-3WvfHY7NvzORek3FcQWLI/B8wQ7NZe0e0Bub9GyLNVxe5Bi+dxnSzEg6E7VsjbUzKnYufJA0hDKbEJ2qCMvpdw==} + cpu: [wasm32] + '@rspack/binding-win32-arm64-msvc@1.2.2': resolution: {integrity: sha512-R+PKBYn6uzTaDdVqTHvjqiJPBr5ZHg1wg5UmFDLNH9OklzVFyQh1JInSdJRb7lzfzTRz6bEkkwUFBPQK/CGScw==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-arm64-msvc@1.3.10': - resolution: {integrity: sha512-YHJPvEujWeWjU6EUF6sDpaec9rsOtKVvy16YCtGaxRpDQXqfuxibnp6Ge0ZTTrY+joRiWehRA9OUI+3McqI+QA==} - cpu: [arm64] - os: [win32] - '@rspack/binding-win32-arm64-msvc@1.3.3': resolution: {integrity: sha512-uXAdDzajFToVrH3fCNVDP/uKQ9i5FQjJc2aYxsnhS9Su/CZB+UQsOecbq6MnIN2s0B9GBKBG8QdQEtS3RtC6Hg==} cpu: [arm64] @@ -2939,13 +2941,13 @@ packages: cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.2.2': - resolution: {integrity: sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==} - cpu: [ia32] + '@rspack/binding-win32-arm64-msvc@1.4.2': + resolution: {integrity: sha512-Y6L9DrLFRW6qBBCY3xBt7townStN5mlcbBTuG1zeXl0KcORPv1G1Cq6HXP6f1em+YsHE1iwnNqLvv4svg5KsnQ==} + cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.3.10': - resolution: {integrity: sha512-2iwSBzVBC89ZSk56MYwgirh3bda2WKmL9I3qPajiTEivChXpX7jp83jAtGE6CPqPYcccYz6nrURTHNUZhqXxVw==} + '@rspack/binding-win32-ia32-msvc@1.2.2': + resolution: {integrity: sha512-dBqz3sRAGZ2f31FgzKLDvIRfq2haRP3X3XVCT0PsiMcvt7QJng+26aYYMy2THatd/nM8IwExYeitHWeiMBoruw==} cpu: [ia32] os: [win32] @@ -2959,13 +2961,13 @@ packages: cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.2.2': - resolution: {integrity: sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==} - cpu: [x64] + '@rspack/binding-win32-ia32-msvc@1.4.2': + resolution: {integrity: sha512-FyTJrL7GcYXPWKUB9Oj2X29kfma6MUgM9PyXGy8gDMti21kMMhpHp/bGVqfurRbazDyklDuLLtbHuawpa6toeA==} + cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.3.10': - resolution: {integrity: sha512-ehWJ9Y5Zezj/+uJpiWbt29RZaRIM00f91PWuabM6/sKmHJhdCEE21u5iI3B8DeW/EjJsH8zkI69YYAxJWwGn9A==} + '@rspack/binding-win32-x64-msvc@1.2.2': + resolution: {integrity: sha512-eeAvaN831KG553cMSHkVldyk6YQn4ujgRHov6r1wtREq7CD3/ka9LMkJUepCN85K7XtwYT0N4KpFIQyf5GTGoA==} cpu: [x64] os: [win32] @@ -2979,18 +2981,23 @@ packages: cpu: [x64] os: [win32] + '@rspack/binding-win32-x64-msvc@1.4.2': + resolution: {integrity: sha512-ODSU26tmG8MfMFDHCaMLCORB64EVdEtDvPP5zJs0Mgh7vQaqweJtqgG0ukZCQy4ApUatOrMaZrLk557jp9Biyw==} + cpu: [x64] + os: [win32] + '@rspack/binding@1.2.2': resolution: {integrity: sha512-GCZwpGFYlLTdJ2soPLwjw9z4LSZ+GdpbHNfBt3Cm/f/bAF8n6mZc7dHUqN893RFh7MPU17HNEL3fMw7XR+6pHg==} - '@rspack/binding@1.3.10': - resolution: {integrity: sha512-9TjO+Ig5U4VqdYWpBsv01n4d2KsgFfdXGIE7zdHXDDbry0avL0J4109ESqSeP9uC+Bi7ZCF53iaxJRvZDflNVQ==} - '@rspack/binding@1.3.3': resolution: {integrity: sha512-zdwJ801tyC8k+Gu5RjNoc7bEtX0MgJzzVv9qpaMwcAUfUfwZgCzXPTqcGMDoNI+Z47Fw59/2fKCmgZhZn60AgA==} '@rspack/binding@1.3.7': resolution: {integrity: sha512-jSXLktIGmNNZssxT+fjZ31IyUO7lRoFrFO+XuqKlMpbnHE8yCrpaHE6rLyDPVO4Vnl6xx/df8usUXtZwIc4jrw==} + '@rspack/binding@1.4.2': + resolution: {integrity: sha512-NdTLlA20ufD0thFvDIwwPk+bX9yo3TDE4XjfvZYbwFyYvBgqJOWQflnbwLgvSTck0MSTiOqWIqpR88ymAvWTqg==} + '@rspack/core@1.2.2': resolution: {integrity: sha512-EeHAmY65Uj62hSbUKesbrcWGE7jfUI887RD03G++Gj8jS4WPHEu1TFODXNOXg6pa7zyIvs2BK0Bm16Kwz8AEaQ==} engines: {node: '>=16.0.0'} @@ -3003,15 +3010,6 @@ packages: '@swc/helpers': optional: true - '@rspack/core@1.3.10': - resolution: {integrity: sha512-YomvSRGuMUQgCE2rNMdff2q1Z0YpZw/z6m5+PVTMSs9l/q69YKUzpbpSD8YyB5i1DddrRxC2RE34DkrBuwlREQ==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@swc/helpers': '>=0.5.1' - peerDependenciesMeta: - '@swc/helpers': - optional: true - '@rspack/core@1.3.3': resolution: {integrity: sha512-+mXVlFcYr0tWezZfJ/gR0fj8njRc7pzEMtTFa2NO5cfsNAKPF/SXm4rb55kfa63r0b3U3N7f2nKrJG9wyG7zMQ==} engines: {node: '>=16.0.0'} @@ -3033,6 +3031,15 @@ packages: '@swc/helpers': optional: true + '@rspack/core@1.4.2': + resolution: {integrity: sha512-Mmk3X3fbOLtRq4jX8Ebp3rfjr75YgupvNksQb0WbaGEVr5l1b6woPH/LaXF2v9U9DP83wmpZJXJ8vclB5JfL/w==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@rspack/lite-tapable@1.0.1': resolution: {integrity: sha512-VynGOEsVw2s8TAlLf/uESfrgfrq2+rcXB1muPJYBWbsm1Oa6r5qVQhjA5ggM6z/coYPrsVMgovl3Ff7Q7OCp1w==} engines: {node: '>=16.0.0'} @@ -3905,9 +3912,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001716: - resolution: {integrity: sha512-49/c1+x3Kwz7ZIWt+4DvK3aMJy9oYXXG6/97JKsnjdCk/6n9vVyWL8NAwVt95Lwt9eigI10Hl782kDfZUUlRXw==} - caniuse-lite@1.0.30001718: resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} @@ -9374,16 +9378,16 @@ snapshots: react-fast-compare: 3.2.2 shallowequal: 1.1.0 - '@emnapi/core@1.2.0': + '@emnapi/core@1.4.3': dependencies: - '@emnapi/wasi-threads': 1.0.1 + '@emnapi/wasi-threads': 1.0.2 tslib: 2.8.1 - '@emnapi/runtime@1.2.0': + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 - '@emnapi/wasi-threads@1.0.1': + '@emnapi/wasi-threads@1.0.2': dependencies: tslib: 2.8.1 @@ -9984,7 +9988,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': + '@module-federation/enhanced@0.12.0(@rspack/core@1.4.2(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/cli': 0.12.0(typescript@5.8.3) @@ -9994,7 +9998,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.12.0(@module-federation/runtime-tools@0.12.0) '@module-federation/managers': 0.12.0 '@module-federation/manifest': 0.12.0(typescript@5.8.3) - '@module-federation/rspack': 0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.12.0(@rspack/core@1.4.2(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 btoa: 1.2.1 @@ -10012,7 +10016,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': + '@module-federation/enhanced@0.8.9(@rspack/core@1.4.2(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.0.0))(react@19.0.0)(typescript@5.8.3)(webpack@5.99.5)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/data-prefetch': 0.8.9(react-dom@19.1.0(react@19.0.0))(react@19.0.0) @@ -10021,7 +10025,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.8.9(@module-federation/runtime-tools@0.8.9) '@module-federation/managers': 0.8.9 '@module-federation/manifest': 0.8.9(typescript@5.8.3) - '@module-federation/rspack': 0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.8.9(@rspack/core@1.4.2(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 btoa: 1.2.1 @@ -10044,7 +10048,7 @@ snapshots: '@module-federation/error-codes@0.13.0': {} - '@module-federation/error-codes@0.13.1': {} + '@module-federation/error-codes@0.15.0': {} '@module-federation/error-codes@0.8.4': {} @@ -10100,7 +10104,7 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/rspack@0.12.0(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.12.0(@rspack/core@1.4.2(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/dts-plugin': 0.12.0(typescript@5.8.3) @@ -10109,7 +10113,7 @@ snapshots: '@module-federation/manifest': 0.12.0(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 - '@rspack/core': 1.3.10(@swc/helpers@0.5.17) + '@rspack/core': 1.4.2(@swc/helpers@0.5.17) btoa: 1.2.1 optionalDependencies: typescript: 5.8.3 @@ -10119,7 +10123,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/rspack@0.8.9(@rspack/core@1.3.10(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.8.9(@rspack/core@1.4.2(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/dts-plugin': 0.8.9(typescript@5.8.3) @@ -10128,7 +10132,7 @@ snapshots: '@module-federation/manifest': 0.8.9(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 - '@rspack/core': 1.3.10(@swc/helpers@0.5.17) + '@rspack/core': 1.4.2(@swc/helpers@0.5.17) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10152,10 +10156,10 @@ snapshots: '@module-federation/error-codes': 0.13.0 '@module-federation/sdk': 0.13.0 - '@module-federation/runtime-core@0.13.1': + '@module-federation/runtime-core@0.15.0': dependencies: - '@module-federation/error-codes': 0.13.1 - '@module-federation/sdk': 0.13.1 + '@module-federation/error-codes': 0.15.0 + '@module-federation/sdk': 0.15.0 '@module-federation/runtime-core@0.6.17': dependencies: @@ -10177,10 +10181,10 @@ snapshots: '@module-federation/runtime': 0.13.0 '@module-federation/webpack-bundler-runtime': 0.13.0 - '@module-federation/runtime-tools@0.13.1': + '@module-federation/runtime-tools@0.15.0': dependencies: - '@module-federation/runtime': 0.13.1 - '@module-federation/webpack-bundler-runtime': 0.13.1 + '@module-federation/runtime': 0.15.0 + '@module-federation/webpack-bundler-runtime': 0.15.0 '@module-federation/runtime-tools@0.8.4': dependencies: @@ -10210,11 +10214,11 @@ snapshots: '@module-federation/runtime-core': 0.13.0 '@module-federation/sdk': 0.13.0 - '@module-federation/runtime@0.13.1': + '@module-federation/runtime@0.15.0': dependencies: - '@module-federation/error-codes': 0.13.1 - '@module-federation/runtime-core': 0.13.1 - '@module-federation/sdk': 0.13.1 + '@module-federation/error-codes': 0.15.0 + '@module-federation/runtime-core': 0.15.0 + '@module-federation/sdk': 0.15.0 '@module-federation/runtime@0.8.4': dependencies: @@ -10233,7 +10237,7 @@ snapshots: '@module-federation/sdk@0.13.0': {} - '@module-federation/sdk@0.13.1': {} + '@module-federation/sdk@0.15.0': {} '@module-federation/sdk@0.6.10': {} @@ -10272,10 +10276,10 @@ snapshots: '@module-federation/runtime': 0.13.0 '@module-federation/sdk': 0.13.0 - '@module-federation/webpack-bundler-runtime@0.13.1': + '@module-federation/webpack-bundler-runtime@0.15.0': dependencies: - '@module-federation/runtime': 0.13.1 - '@module-federation/sdk': 0.13.1 + '@module-federation/runtime': 0.15.0 + '@module-federation/sdk': 0.15.0 '@module-federation/webpack-bundler-runtime@0.8.4': dependencies: @@ -10287,10 +10291,17 @@ snapshots: '@module-federation/runtime': 0.8.9 '@module-federation/sdk': 0.8.9 + '@napi-rs/wasm-runtime@0.2.11': + dependencies: + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 + '@tybys/wasm-util': 0.9.0 + optional: true + '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.2.0 - '@emnapi/runtime': 1.2.0 + '@emnapi/core': 1.4.3 + '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': @@ -10793,12 +10804,12 @@ snapshots: '@rsdoctor/client@0.4.11': {} - '@rsdoctor/core@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/core@0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) axios: 1.8.4 enhanced-resolve: 5.12.0 filesize: 10.1.6 @@ -10816,10 +10827,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/graph@0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) lodash: 4.17.21 socket.io: 4.7.2 source-map: 0.7.4 @@ -10830,14 +10841,14 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: - '@rsdoctor/core': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rspack/core': 1.3.10(@swc/helpers@0.5.17) + '@rsdoctor/core': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rspack/core': 1.4.2(@swc/helpers@0.5.17) lodash: 4.17.21 transitivePeerDependencies: - bufferutil @@ -10846,12 +10857,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/sdk@0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@rsdoctor/client': 0.4.11 - '@rsdoctor/graph': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -10871,7 +10882,7 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/types@0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 @@ -10879,12 +10890,12 @@ snapshots: source-map: 0.7.4 webpack: 5.99.5 optionalDependencies: - '@rspack/core': 1.3.10(@swc/helpers@0.5.17) + '@rspack/core': 1.4.2(@swc/helpers@0.5.17) - '@rsdoctor/utils@0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5)': + '@rsdoctor/utils@0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5)': dependencies: '@babel/code-frame': 7.25.7 - '@rsdoctor/types': 0.4.11(@rspack/core@1.3.10(@swc/helpers@0.5.17))(webpack@5.99.5) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.2(@swc/helpers@0.5.17))(webpack@5.99.5) '@types/estree': 1.0.5 acorn: 8.14.0 acorn-import-assertions: 1.9.0(acorn@8.14.0) @@ -10919,19 +10930,16 @@ snapshots: '@rspack/binding-darwin-arm64@1.2.2': optional: true - '@rspack/binding-darwin-arm64@1.3.10': - optional: true - '@rspack/binding-darwin-arm64@1.3.3': optional: true '@rspack/binding-darwin-arm64@1.3.7': optional: true - '@rspack/binding-darwin-x64@1.2.2': + '@rspack/binding-darwin-arm64@1.4.2': optional: true - '@rspack/binding-darwin-x64@1.3.10': + '@rspack/binding-darwin-x64@1.2.2': optional: true '@rspack/binding-darwin-x64@1.3.3': @@ -10940,10 +10948,10 @@ snapshots: '@rspack/binding-darwin-x64@1.3.7': optional: true - '@rspack/binding-linux-arm64-gnu@1.2.2': + '@rspack/binding-darwin-x64@1.4.2': optional: true - '@rspack/binding-linux-arm64-gnu@1.3.10': + '@rspack/binding-linux-arm64-gnu@1.2.2': optional: true '@rspack/binding-linux-arm64-gnu@1.3.3': @@ -10952,10 +10960,10 @@ snapshots: '@rspack/binding-linux-arm64-gnu@1.3.7': optional: true - '@rspack/binding-linux-arm64-musl@1.2.2': + '@rspack/binding-linux-arm64-gnu@1.4.2': optional: true - '@rspack/binding-linux-arm64-musl@1.3.10': + '@rspack/binding-linux-arm64-musl@1.2.2': optional: true '@rspack/binding-linux-arm64-musl@1.3.3': @@ -10964,10 +10972,10 @@ snapshots: '@rspack/binding-linux-arm64-musl@1.3.7': optional: true - '@rspack/binding-linux-x64-gnu@1.2.2': + '@rspack/binding-linux-arm64-musl@1.4.2': optional: true - '@rspack/binding-linux-x64-gnu@1.3.10': + '@rspack/binding-linux-x64-gnu@1.2.2': optional: true '@rspack/binding-linux-x64-gnu@1.3.3': @@ -10976,10 +10984,10 @@ snapshots: '@rspack/binding-linux-x64-gnu@1.3.7': optional: true - '@rspack/binding-linux-x64-musl@1.2.2': + '@rspack/binding-linux-x64-gnu@1.4.2': optional: true - '@rspack/binding-linux-x64-musl@1.3.10': + '@rspack/binding-linux-x64-musl@1.2.2': optional: true '@rspack/binding-linux-x64-musl@1.3.3': @@ -10988,10 +10996,15 @@ snapshots: '@rspack/binding-linux-x64-musl@1.3.7': optional: true - '@rspack/binding-win32-arm64-msvc@1.2.2': + '@rspack/binding-linux-x64-musl@1.4.2': optional: true - '@rspack/binding-win32-arm64-msvc@1.3.10': + '@rspack/binding-wasm32-wasi@1.4.2': + dependencies: + '@napi-rs/wasm-runtime': 0.2.11 + optional: true + + '@rspack/binding-win32-arm64-msvc@1.2.2': optional: true '@rspack/binding-win32-arm64-msvc@1.3.3': @@ -11000,10 +11013,10 @@ snapshots: '@rspack/binding-win32-arm64-msvc@1.3.7': optional: true - '@rspack/binding-win32-ia32-msvc@1.2.2': + '@rspack/binding-win32-arm64-msvc@1.4.2': optional: true - '@rspack/binding-win32-ia32-msvc@1.3.10': + '@rspack/binding-win32-ia32-msvc@1.2.2': optional: true '@rspack/binding-win32-ia32-msvc@1.3.3': @@ -11012,10 +11025,10 @@ snapshots: '@rspack/binding-win32-ia32-msvc@1.3.7': optional: true - '@rspack/binding-win32-x64-msvc@1.2.2': + '@rspack/binding-win32-ia32-msvc@1.4.2': optional: true - '@rspack/binding-win32-x64-msvc@1.3.10': + '@rspack/binding-win32-x64-msvc@1.2.2': optional: true '@rspack/binding-win32-x64-msvc@1.3.3': @@ -11024,6 +11037,9 @@ snapshots: '@rspack/binding-win32-x64-msvc@1.3.7': optional: true + '@rspack/binding-win32-x64-msvc@1.4.2': + optional: true + '@rspack/binding@1.2.2': optionalDependencies: '@rspack/binding-darwin-arm64': 1.2.2 @@ -11036,18 +11052,6 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.2.2 '@rspack/binding-win32-x64-msvc': 1.2.2 - '@rspack/binding@1.3.10': - optionalDependencies: - '@rspack/binding-darwin-arm64': 1.3.10 - '@rspack/binding-darwin-x64': 1.3.10 - '@rspack/binding-linux-arm64-gnu': 1.3.10 - '@rspack/binding-linux-arm64-musl': 1.3.10 - '@rspack/binding-linux-x64-gnu': 1.3.10 - '@rspack/binding-linux-x64-musl': 1.3.10 - '@rspack/binding-win32-arm64-msvc': 1.3.10 - '@rspack/binding-win32-ia32-msvc': 1.3.10 - '@rspack/binding-win32-x64-msvc': 1.3.10 - '@rspack/binding@1.3.3': optionalDependencies: '@rspack/binding-darwin-arm64': 1.3.3 @@ -11072,6 +11076,19 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.3.7 '@rspack/binding-win32-x64-msvc': 1.3.7 + '@rspack/binding@1.4.2': + optionalDependencies: + '@rspack/binding-darwin-arm64': 1.4.2 + '@rspack/binding-darwin-x64': 1.4.2 + '@rspack/binding-linux-arm64-gnu': 1.4.2 + '@rspack/binding-linux-arm64-musl': 1.4.2 + '@rspack/binding-linux-x64-gnu': 1.4.2 + '@rspack/binding-linux-x64-musl': 1.4.2 + '@rspack/binding-wasm32-wasi': 1.4.2 + '@rspack/binding-win32-arm64-msvc': 1.4.2 + '@rspack/binding-win32-ia32-msvc': 1.4.2 + '@rspack/binding-win32-x64-msvc': 1.4.2 + '@rspack/core@1.2.2(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.8.4 @@ -11081,15 +11098,6 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 - '@rspack/core@1.3.10(@swc/helpers@0.5.17)': - dependencies: - '@module-federation/runtime-tools': 0.13.1 - '@rspack/binding': 1.3.10 - '@rspack/lite-tapable': 1.0.1 - caniuse-lite: 1.0.30001718 - optionalDependencies: - '@swc/helpers': 0.5.17 - '@rspack/core@1.3.3(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.11.2 @@ -11108,6 +11116,14 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 + '@rspack/core@1.4.2(@swc/helpers@0.5.17)': + dependencies: + '@module-federation/runtime-tools': 0.15.0 + '@rspack/binding': 1.4.2 + '@rspack/lite-tapable': 1.0.1 + optionalDependencies: + '@swc/helpers': 0.5.17 + '@rspack/lite-tapable@1.0.1': {} '@rspack/plugin-react-refresh@1.0.0(react-refresh@0.14.2)': @@ -11871,7 +11887,7 @@ snapshots: autoprefixer@10.4.20(postcss@8.5.1): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001716 + caniuse-lite: 1.0.30001718 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 @@ -12066,7 +12082,7 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001716 + caniuse-lite: 1.0.30001718 electron-to-chromium: 1.5.96 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -12132,8 +12148,6 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001716: {} - caniuse-lite@1.0.30001718: {} ccount@2.0.1: {} @@ -15721,14 +15735,14 @@ snapshots: optionalDependencies: postcss: 8.5.1 - postcss-loader@8.1.1(@rspack/core@1.3.10(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5): + postcss-loader@8.1.1(@rspack/core@1.4.2(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.99.5): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.1 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.3.10(@swc/helpers@0.5.17) + '@rspack/core': 1.4.2(@swc/helpers@0.5.17) webpack: 5.99.5 transitivePeerDependencies: - typescript diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index bc29e6482..b7e21f04c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,7 @@ packages: - "website" catalog: - "@rspack/core": ^1.3.10 + "@rspack/core": ^1.4.2 "@rslib/core": ^0.6.3 "@swc/helpers": ~0.5.17 "@types/node": ^18 From f7e86851caf3f5e2c7a01c21a798bab84556f9db Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 2 Jul 2025 19:14:09 +0200 Subject: [PATCH 05/61] chore: ignore profiling mismatch --- packages/repack/src/commands/rspack/profile.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/repack/src/commands/rspack/profile.ts b/packages/repack/src/commands/rspack/profile.ts index 472e2df8c..c47e5c6e0 100644 --- a/packages/repack/src/commands/rspack/profile.ts +++ b/packages/repack/src/commands/rspack/profile.ts @@ -61,6 +61,7 @@ export async function applyProfile( await ensureFileDir(traceOutput); await rspack.experiments.globalTrace.register( filter, + // @ts-expect-error: chrome was dropped in favor of perfetto, needs revisiting traceLayer, traceOutput ); From 68617b2247ee89c4fd1790d7436bbff32f4e6654 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 2 Jul 2025 19:23:20 +0200 Subject: [PATCH 06/61] chore: fix types --- packages/repack/package.json | 1 + pnpm-lock.yaml | 3 +++ 2 files changed, 4 insertions(+) diff --git a/packages/repack/package.json b/packages/repack/package.json index f481281c0..5a9dbbadf 100644 --- a/packages/repack/package.json +++ b/packages/repack/package.json @@ -110,6 +110,7 @@ "@module-federation/sdk": "0.6.10", "@rspack/core": "catalog:", "@swc/helpers": "catalog:", + "@types/babel__core": "^7.20.5", "@types/dedent": "^0.7.0", "@types/gradient-string": "^1.1.6", "@types/jest": "^29.5.12", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 38d7de34a..aa96d045a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -630,6 +630,9 @@ importers: '@swc/helpers': specifier: 'catalog:' version: 0.5.17 + '@types/babel__core': + specifier: ^7.20.5 + version: 7.20.5 '@types/dedent': specifier: ^0.7.0 version: 0.7.2 From 6dbba247ad4c52f64dda9affbbdcad5e8479d219 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 2 Jul 2025 19:27:56 +0200 Subject: [PATCH 07/61] chore: improve types --- packages/repack/src/commands/rspack/start.ts | 1 - packages/repack/src/plugins/DevelopmentPlugin.ts | 3 +-- packages/repack/src/types/dev-server-options.d.ts | 5 ++++- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/repack/src/commands/rspack/start.ts b/packages/repack/src/commands/rspack/start.ts index 9f1972f86..2541a0cb3 100644 --- a/packages/repack/src/commands/rspack/start.ts +++ b/packages/repack/src/commands/rspack/start.ts @@ -86,7 +86,6 @@ export async function start( const { createServer } = await import('@callstack/repack-dev-server'); const { start, stop } = await createServer({ - // @ts-ignore options: { ...devServerOptions, rootDir: cliConfig.root, diff --git a/packages/repack/src/plugins/DevelopmentPlugin.ts b/packages/repack/src/plugins/DevelopmentPlugin.ts index a2398ea53..874672619 100644 --- a/packages/repack/src/plugins/DevelopmentPlugin.ts +++ b/packages/repack/src/plugins/DevelopmentPlugin.ts @@ -1,5 +1,4 @@ import path from 'node:path'; -// @ts-ignore import type { DevServerOptions } from '@callstack/repack-dev-server'; import type { Compiler, @@ -105,7 +104,7 @@ export class DevelopmentPlugin implements RspackPluginInstance { const host = compiler.options.devServer.host; const port = compiler.options.devServer.port; - // @ts-ignore + // @ts-expect-error: devServertypes here are not being overridden properly const protocol = this.getProtocolType(compiler.options.devServer); const platform = this.config.platform ?? (compiler.options.name as string); diff --git a/packages/repack/src/types/dev-server-options.d.ts b/packages/repack/src/types/dev-server-options.d.ts index e22d132ad..4fcd64154 100644 --- a/packages/repack/src/types/dev-server-options.d.ts +++ b/packages/repack/src/types/dev-server-options.d.ts @@ -1,4 +1,5 @@ import type { DevServerOptions } from '@callstack/repack-dev-server'; +import type { RspackOptions } from '@rspack/core'; // extend webpack Configuration with devServer field declare module 'webpack' { @@ -9,5 +10,7 @@ declare module 'webpack' { // override rspack DevServer type declare module '@rspack/core' { - export interface DevServer extends DevServerOptions {} + export interface Configuration extends RspackOptions { + devServer?: DevServerOptions; + } } From f959ea2e297030fff7f1631217766a17c9575cda Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Tue, 29 Jul 2025 12:54:35 +0200 Subject: [PATCH 08/61] chore: update podfile locks --- apps/tester-app/ios/Podfile.lock | 2 +- apps/tester-federation-v2/ios/Podfile.lock | 2 +- apps/tester-federation/ios/Podfile.lock | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/tester-app/ios/Podfile.lock b/apps/tester-app/ios/Podfile.lock index 84ca4c1cd..3b6883c9a 100644 --- a/apps/tester-app/ios/Podfile.lock +++ b/apps/tester-app/ios/Podfile.lock @@ -2925,7 +2925,7 @@ SPEC CHECKSUMS: RNWorklets: 5e10b99988778b7a08a8aaeba9ad7f3e56787bf4 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SwiftyRSA: 8c6dd1ea7db1b8dc4fb517a202f88bb1354bc2c6 - Yoga: 395b5d614cd7cbbfd76b05d01bd67230a6ad004e + Yoga: 0c4b7d2aacc910a1f702694fa86be830386f4ceb PODFILE CHECKSUM: 6d7cbe03444d5e87210979fb32a0eca299d758fe diff --git a/apps/tester-federation-v2/ios/Podfile.lock b/apps/tester-federation-v2/ios/Podfile.lock index 1a730b2e4..aa48b3bcf 100644 --- a/apps/tester-federation-v2/ios/Podfile.lock +++ b/apps/tester-federation-v2/ios/Podfile.lock @@ -2702,7 +2702,7 @@ SPEC CHECKSUMS: RNScreens: 75074e642b69b086813a943bdf63da7085fb2166 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SwiftyRSA: 8c6dd1ea7db1b8dc4fb517a202f88bb1354bc2c6 - Yoga: 395b5d614cd7cbbfd76b05d01bd67230a6ad004e + Yoga: 0c4b7d2aacc910a1f702694fa86be830386f4ceb PODFILE CHECKSUM: 3d5c18eefbf70d38fbbfe81a262195cadac1f5dd diff --git a/apps/tester-federation/ios/Podfile.lock b/apps/tester-federation/ios/Podfile.lock index ca3b2d114..ceaee211d 100644 --- a/apps/tester-federation/ios/Podfile.lock +++ b/apps/tester-federation/ios/Podfile.lock @@ -2702,7 +2702,7 @@ SPEC CHECKSUMS: RNScreens: 75074e642b69b086813a943bdf63da7085fb2166 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 SwiftyRSA: 8c6dd1ea7db1b8dc4fb517a202f88bb1354bc2c6 - Yoga: 395b5d614cd7cbbfd76b05d01bd67230a6ad004e + Yoga: 0c4b7d2aacc910a1f702694fa86be830386f4ceb PODFILE CHECKSUM: 16a059e985a55bc49163512a311428a48f715334 From 112c4beed4831120b3ca38dfcfa2bf15fb465fb2 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Tue, 29 Jul 2025 12:55:28 +0200 Subject: [PATCH 09/61] chore: use babel loader in federation v2 tester --- apps/tester-federation-v2/babel.config.js | 2 +- .../configs/rspack.host-app.mts | 19 ++++++++++++++++++- .../configs/rspack.mini-app.mts | 19 ++++++++++++++++++- 3 files changed, 37 insertions(+), 3 deletions(-) diff --git a/apps/tester-federation-v2/babel.config.js b/apps/tester-federation-v2/babel.config.js index d4461aec7..4eb77b7a4 100644 --- a/apps/tester-federation-v2/babel.config.js +++ b/apps/tester-federation-v2/babel.config.js @@ -1,4 +1,4 @@ module.exports = { - presets: ['module:@react-native/babel-preset'], + // presets: ['module:@react-native/babel-preset'], comments: true, }; diff --git a/apps/tester-federation-v2/configs/rspack.host-app.mts b/apps/tester-federation-v2/configs/rspack.host-app.mts index 4dcc7c07b..288c444d0 100644 --- a/apps/tester-federation-v2/configs/rspack.host-app.mts +++ b/apps/tester-federation-v2/configs/rspack.host-app.mts @@ -8,6 +8,9 @@ export default Repack.defineRspackConfig((env) => { mode, context, entry: './src/host/index.js', + experiments: { + parallelLoader: true, + }, resolve: { ...Repack.getResolveOptions({ enablePackageExports: true }), }, @@ -17,7 +20,21 @@ export default Repack.defineRspackConfig((env) => { }, module: { rules: [ - ...Repack.getJsTransformRules(), + ...Repack.getJsTransformRules({ + flow: { enabled: false }, + codegen: { enabled: false }, + }), + { + test: /\.[cm]?[jt]sx?$/, + use: { + loader: '@callstack/repack/babel-loader', + parallel: true, + options: { + projectRoot: context, + }, + }, + type: 'javascript/auto', + }, ...Repack.getAssetTransformRules(), ], }, diff --git a/apps/tester-federation-v2/configs/rspack.mini-app.mts b/apps/tester-federation-v2/configs/rspack.mini-app.mts index a2ea6cfa7..f5ebba3bf 100644 --- a/apps/tester-federation-v2/configs/rspack.mini-app.mts +++ b/apps/tester-federation-v2/configs/rspack.mini-app.mts @@ -8,6 +8,9 @@ export default Repack.defineRspackConfig((env) => { mode, context, entry: './src/mini/index.js', + experiments: { + parallelLoader: true, + }, resolve: { ...Repack.getResolveOptions({ enablePackageExports: true }), }, @@ -17,7 +20,21 @@ export default Repack.defineRspackConfig((env) => { }, module: { rules: [ - ...Repack.getJsTransformRules(), + ...Repack.getJsTransformRules({ + flow: { enabled: false }, + codegen: { enabled: false }, + }), + { + test: /\.[cm]?[jt]sx?$/, + use: { + loader: '@callstack/repack/babel-loader', + parallel: true, + options: { + projectRoot: context, + }, + }, + type: 'javascript/auto', + }, ...Repack.getAssetTransformRules({ inline: true }), ], }, From 028d98748a541c039b28e0c73ec654c5c706a458 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 30 Jul 2025 16:50:06 +0200 Subject: [PATCH 10/61] feat: add module rules normalization --- .../common/config/makeCompilerConfig.ts | 6 +- .../commands/common/config/normalizeConfig.ts | 19 +- .../commands/common/normalizeModuleRules.ts | 185 ++++++++++++++++++ packages/repack/src/commands/types.ts | 3 +- .../src/loaders/babelLoader/babelLoader.ts | 18 ++ .../repack/src/loaders/babelLoader/options.ts | 3 + .../src/utils/internal/babelConfigAnalyzer.ts | 68 +++++++ .../src/utils/internal/babelPluginMapper.ts | 128 ++++++++++++ packages/repack/src/utils/internal/index.ts | 4 + .../utils/internal/loaderChainGenerator.ts | 74 +++++++ .../src/utils/internal/swcConfigGenerator.ts | 139 +++++++++++++ 11 files changed, 644 insertions(+), 3 deletions(-) create mode 100644 packages/repack/src/commands/common/normalizeModuleRules.ts create mode 100644 packages/repack/src/utils/internal/babelConfigAnalyzer.ts create mode 100644 packages/repack/src/utils/internal/babelPluginMapper.ts create mode 100644 packages/repack/src/utils/internal/index.ts create mode 100644 packages/repack/src/utils/internal/loaderChainGenerator.ts create mode 100644 packages/repack/src/utils/internal/swcConfigGenerator.ts diff --git a/packages/repack/src/commands/common/config/makeCompilerConfig.ts b/packages/repack/src/commands/common/config/makeCompilerConfig.ts index 1740ef02f..b3988a3d2 100644 --- a/packages/repack/src/commands/common/config/makeCompilerConfig.ts +++ b/packages/repack/src/commands/common/config/makeCompilerConfig.ts @@ -67,7 +67,11 @@ export async function makeCompilerConfig( // normalize the configs const normalizedConfigs = configs.map((config, index) => - normalizeConfig(config, options.platforms[index]) + normalizeConfig(config, { + bundler: options.bundler, + platform: options.platforms[index], + rootDir, + }) ); const plugins = normalizedConfigs.flatMap((config) => diff --git a/packages/repack/src/commands/common/config/normalizeConfig.ts b/packages/repack/src/commands/common/config/normalizeConfig.ts index 8e0029d7d..4e91a2d87 100644 --- a/packages/repack/src/commands/common/config/normalizeConfig.ts +++ b/packages/repack/src/commands/common/config/normalizeConfig.ts @@ -1,5 +1,6 @@ import { customizeArray, mergeWithCustomize } from 'webpack-merge'; import type { ConfigurationObject } from '../../types.js'; +import { normalizeModuleRules } from '../normalizeModuleRules.js'; function normalizeDevServerHost(host?: string): string | undefined { switch (host) { @@ -51,8 +52,14 @@ function normalizeResolveExtensions( export function normalizeConfig( config: C, - platform: string + options: { + bundler: 'rspack' | 'webpack'; + platform: string; + rootDir: string; + } ): C { + const { bundler, platform, rootDir } = options; + const normalizedConfig = {} as C; /* normalize compiler name to be equal to platform */ @@ -102,6 +109,16 @@ export function normalizeConfig( }; } + /* normalize module rules by expanding repack-loader configuration */ + normalizedConfig.module = { + ...normalizedConfig.module, + rules: normalizeModuleRules(config.module.rules, { + bundler, + projectRoot: rootDir, + platform, + }), + }; + /* return the normalized config object */ return mergeWithCustomize({ customizeArray: customizeArray({ diff --git a/packages/repack/src/commands/common/normalizeModuleRules.ts b/packages/repack/src/commands/common/normalizeModuleRules.ts new file mode 100644 index 000000000..1a3e9971e --- /dev/null +++ b/packages/repack/src/commands/common/normalizeModuleRules.ts @@ -0,0 +1,185 @@ +import { loadOptions } from '@babel/core'; +import type { RuleSetRule } from '@rspack/core'; +import { + analyzeBabelConfig, + filterTransformPlugins, + generateLoaderChain, + separateBabelPlugins, +} from '../../utils/internal/index.js'; + +export interface NormalizeModuleRulesOptions { + bundler: 'rspack' | 'webpack'; + projectRoot: string; + platform: string; +} + +/** + * Checks if a rule contains the repack-loader placeholder + */ +function hasRepackLoader(rule: RuleSetRule): boolean { + if (!rule.use) return false; + + const uses = Array.isArray(rule.use) ? rule.use : [rule.use]; + + return uses.some((use) => { + if (typeof use === 'string') { + return use === 'repack-loader'; + } + if (typeof use === 'object' && use && 'loader' in use) { + return use.loader === 'repack-loader'; + } + return false; + }); +} + +/** + * Extracts babel config from the project + */ +function getProjectBabelConfig(projectRoot: string) { + // Try to load babel config using Babel's config resolution + const babelConfig = loadOptions({ + cwd: projectRoot, + filename: `${projectRoot}/dummy.js`, // Dummy filename for config resolution + }); + + return babelConfig || {}; +} + +/** + * Determines the syntax and jsx settings based on the rule test pattern + */ +function determineSyntaxFromRule(rule: RuleSetRule): { + syntax: 'js' | 'ts'; + jsx: boolean; +} { + const test = rule.test; + + if (!test) { + return { syntax: 'js', jsx: false }; + } + + const testStr = test.toString(); + + // Check for TypeScript + const isTypeScript = testStr.includes('.ts') || testStr.includes('\\.ts'); + + // Check for JSX/TSX + const hasJsx = + testStr.includes('.jsx') || + testStr.includes('.tsx') || + testStr.includes('\\.jsx') || + testStr.includes('\\.tsx'); + + return { + syntax: isTypeScript ? 'ts' : 'js', + jsx: hasJsx, + }; +} + +/** + * Normalizes a single rule by replacing repack-loader with SWC + Babel chain + */ +function normalizeRule( + rule: RuleSetRule, + options: NormalizeModuleRulesOptions +): RuleSetRule { + if (!hasRepackLoader(rule)) { + return rule; + } + + try { + // Get project babel configuration + const babelConfig = getProjectBabelConfig(options.projectRoot); + + // Analyze babel config to extract plugins + const analyzed = analyzeBabelConfig(babelConfig); + + // Filter to only transform plugins + const transformPlugins = filterTransformPlugins(analyzed.plugins); + + // Separate into SWC-compatible and Babel-only plugins + const separated = separateBabelPlugins(transformPlugins); + + // Determine syntax from rule + const { syntax, jsx } = determineSyntaxFromRule(rule); + + // Generate loader chain + const loaderChain = generateLoaderChain({ + projectRoot: options.projectRoot, + swcCompatiblePlugins: separated.swcCompatible, + babelOnlyPlugins: separated.babelOnly, + originalBabelConfig: analyzed.originalConfig, + syntax, + jsx, + }); + + // Replace the rule's use array + return { + ...rule, + use: loaderChain, + }; + } catch (error) { + console.warn( + 'Failed to normalize repack-loader, falling back to babel-loader:', + error + ); + + // Fallback to just babel-loader + return { + ...rule, + use: [ + { + loader: '@callstack/repack/babel-loader', + options: { + projectRoot: options.projectRoot, + }, + }, + ], + }; + } +} + +/** + * Normalizes module rules by replacing repack-loader placeholders with SWC + Babel chains + */ +export function normalizeModuleRules( + rules: (RuleSetRule | false | null | undefined | 0 | '')[] | undefined, + options: NormalizeModuleRulesOptions +): (RuleSetRule | false | null | undefined | 0 | '')[] | undefined { + if (!rules) return undefined; + + const normalizedRules: (RuleSetRule | false | null | undefined | 0 | '')[] = + []; + + for (const rule of rules) { + // Skip falsy values + if (!rule) { + normalizedRules.push(rule); + continue; + } + + if (rule.oneOf) { + // Handle oneOf rules + const normalizedOneOf = rule.oneOf.map((r) => + r ? normalizeRule(r, options) : r + ); + normalizedRules.push({ + ...rule, + oneOf: normalizedOneOf, + }); + } else if (rule.rules) { + // Handle nested rules + const normalizedNested = normalizeModuleRules(rule.rules, options); + normalizedRules.push({ + ...rule, + rules: normalizedNested, + }); + } else { + // Handle regular rules + const normalized = normalizeRule(rule, options); + normalizedRules.push(normalized); + } + } + + return normalizedRules; +} diff --git a/packages/repack/src/commands/types.ts b/packages/repack/src/commands/types.ts index 135ff3926..58d6859a3 100644 --- a/packages/repack/src/commands/types.ts +++ b/packages/repack/src/commands/types.ts @@ -67,7 +67,8 @@ type ConfigKeys = | 'entry' | 'optimization' | 'output' - | 'resolve'; + | 'resolve' + | 'module'; export type ConfigurationObject = Partial>; diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index a17d2d8aa..b4eea864f 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -27,6 +27,7 @@ interface CustomOptions { enableBabelRCLookup?: boolean; extendsBabelConfigPath?: string; projectRoot: string; + babelConfig?: TransformOptions; } /** * Return a memoized function that checks for the existence of a @@ -86,6 +87,22 @@ function buildBabelConfig( filename: string, options: CustomOptions ): TransformOptions { + // If a pre-computed babel config is provided, use it directly + if (options.babelConfig) { + const extraConfig: TransformOptions = { + code: true, + cwd: options.projectRoot, + filename, + highlightCode: true, + compact: false, + comments: true, + minified: false, + }; + + return { ...options.babelConfig, ...extraConfig }; + } + + // Otherwise, use the existing logic to load from project const babelRC = getBabelRC(options); const extraConfig: TransformOptions = { @@ -151,6 +168,7 @@ export default function babelLoader( // this is currently broken in Rspack and needs to be fixed upstream // for now we can pass this as an option to loader projectRoot: options.projectRoot, + babelConfig: options.babelConfig, }, }); // @ts-ignore diff --git a/packages/repack/src/loaders/babelLoader/options.ts b/packages/repack/src/loaders/babelLoader/options.ts index 7582c14b1..7a65f6cd0 100644 --- a/packages/repack/src/loaders/babelLoader/options.ts +++ b/packages/repack/src/loaders/babelLoader/options.ts @@ -1,8 +1,10 @@ +import type { TransformOptions } from '@babel/core'; import type { LoaderContext } from '@rspack/core'; import type { validate } from 'schema-utils'; export interface BabelLoaderOptions { projectRoot: string; + babelConfig?: TransformOptions; } type Schema = Parameters[0]; @@ -12,6 +14,7 @@ export const optionsSchema: Schema = { required: ['projectRoot'], properties: { projectRoot: { type: 'string' }, + babelConfig: { type: 'object' }, }, }; diff --git a/packages/repack/src/utils/internal/babelConfigAnalyzer.ts b/packages/repack/src/utils/internal/babelConfigAnalyzer.ts new file mode 100644 index 000000000..c503c6cc1 --- /dev/null +++ b/packages/repack/src/utils/internal/babelConfigAnalyzer.ts @@ -0,0 +1,68 @@ +import { type TransformOptions, loadOptions } from '@babel/core'; + +export interface BabelPlugin { + name: string; + options?: any; +} + +export interface AnalyzedBabelConfig { + plugins: BabelPlugin[]; + originalConfig: TransformOptions; +} + +/** + * Analyzes a Babel configuration by loading and flattening it. + * This resolves all presets into their constituent plugins. + */ +export function analyzeBabelConfig( + babelConfig: TransformOptions +): AnalyzedBabelConfig { + // Load and flatten the babel configuration + const loadedOptions = loadOptions(babelConfig) as TransformOptions | null; + + if (!loadedOptions) { + return { + plugins: [], + originalConfig: babelConfig, + }; + } + + // Extract plugins from the flattened configuration + const plugins: BabelPlugin[] = []; + + if (loadedOptions.plugins) { + for (const plugin of loadedOptions.plugins) { + if (Array.isArray(plugin)) { + const [pluginDef, options] = plugin; + const name = + typeof pluginDef === 'string' + ? pluginDef + : (pluginDef as any)?.key || 'unknown'; + + plugins.push({ name, options }); + } else { + const name = + typeof plugin === 'string' + ? plugin + : (plugin as any)?.key || 'unknown'; + + plugins.push({ name }); + } + } + } + + return { + plugins, + originalConfig: babelConfig, + }; +} + +/** + * Filters plugins that start with 'transform-' prefix + */ +export function filterTransformPlugins(plugins: BabelPlugin[]): BabelPlugin[] { + return plugins.filter((plugin) => { + const pluginName = plugin.name.split('/').pop() || ''; + return pluginName.startsWith('transform-'); + }); +} diff --git a/packages/repack/src/utils/internal/babelPluginMapper.ts b/packages/repack/src/utils/internal/babelPluginMapper.ts new file mode 100644 index 000000000..a58bcc354 --- /dev/null +++ b/packages/repack/src/utils/internal/babelPluginMapper.ts @@ -0,0 +1,128 @@ +import type { BabelPlugin } from './babelConfigAnalyzer.js'; + +export interface SwcTransformMapping { + swcEquivalent: string; + optionsMapper?: (babelOptions: any) => any; +} + +// Mapping of Babel transform plugins to SWC equivalents +// Note: SWC uses the same names as Babel plugins in the env.include array +const BABEL_TO_SWC_MAPPINGS: Record = { + 'transform-block-scoping': { + swcEquivalent: 'transform-block-scoping', + }, + 'transform-class-properties': { + swcEquivalent: 'transform-class-properties', + optionsMapper: (options) => ({ + loose: options?.loose ?? true, // React Native default + }), + }, + 'transform-private-methods': { + swcEquivalent: 'transform-private-methods', + optionsMapper: (options) => ({ + loose: options?.loose ?? true, + }), + }, + 'transform-private-property-in-object': { + swcEquivalent: 'transform-private-property-in-object', + optionsMapper: (options) => ({ + loose: options?.loose ?? true, + }), + }, + 'transform-classes': { + swcEquivalent: 'transform-classes', + optionsMapper: (options) => ({ + loose: options?.loose ?? false, + }), + }, + 'transform-destructuring': { + swcEquivalent: 'transform-destructuring', + optionsMapper: (options) => ({ + loose: options?.loose ?? false, + }), + }, + 'transform-async-to-generator': { + swcEquivalent: 'transform-async-to-generator', + }, + 'transform-async-generator-functions': { + swcEquivalent: 'transform-async-generator-functions', + }, + 'transform-unicode-regex': { + swcEquivalent: 'transform-unicode-regex', + }, + 'transform-named-capturing-groups-regex': { + swcEquivalent: 'transform-named-capturing-groups-regex', + }, + 'transform-optional-chaining': { + swcEquivalent: 'transform-optional-chaining', + optionsMapper: (options) => ({ + loose: options?.loose ?? false, + }), + }, + 'transform-spread': { + swcEquivalent: 'transform-spread', + optionsMapper: (options) => ({ + loose: options?.loose ?? false, + }), + }, + 'transform-object-rest-spread': { + swcEquivalent: 'transform-object-rest-spread', + optionsMapper: (options) => ({ + loose: options?.loose ?? false, + useBuiltIns: options?.useBuiltIns ?? false, + }), + }, + 'transform-class-static-block': { + swcEquivalent: 'transform-class-static-block', + }, + 'transform-parameters': { + swcEquivalent: 'transform-parameters', + optionsMapper: (options) => ({ + loose: options?.loose ?? false, + }), + }, + 'transform-function-name': { + swcEquivalent: 'transform-function-name', + }, +}; + +export interface PluginSeparationResult { + swcCompatible: Array<{ + plugin: BabelPlugin; + swcConfig: any; + }>; + babelOnly: BabelPlugin[]; +} + +/** + * Separates Babel plugins into SWC-compatible and Babel-only groups + */ +export function separateBabelPlugins( + plugins: BabelPlugin[] +): PluginSeparationResult { + const swcCompatible: PluginSeparationResult['swcCompatible'] = []; + const babelOnly: BabelPlugin[] = []; + + for (const plugin of plugins) { + const pluginName = plugin.name.split('/').pop() || ''; + const mapping = BABEL_TO_SWC_MAPPINGS[pluginName]; + + if (mapping) { + const swcConfig = mapping.optionsMapper + ? mapping.optionsMapper(plugin.options) + : {}; + + swcCompatible.push({ + plugin, + swcConfig: { + name: mapping.swcEquivalent, + options: swcConfig, + }, + }); + } else { + babelOnly.push(plugin); + } + } + + return { swcCompatible, babelOnly }; +} diff --git a/packages/repack/src/utils/internal/index.ts b/packages/repack/src/utils/internal/index.ts new file mode 100644 index 000000000..289a3d92a --- /dev/null +++ b/packages/repack/src/utils/internal/index.ts @@ -0,0 +1,4 @@ +export * from './babelConfigAnalyzer.js'; +export * from './babelPluginMapper.js'; +export * from './swcConfigGenerator.js'; +export * from './loaderChainGenerator.js'; diff --git a/packages/repack/src/utils/internal/loaderChainGenerator.ts b/packages/repack/src/utils/internal/loaderChainGenerator.ts new file mode 100644 index 000000000..17e6d4e30 --- /dev/null +++ b/packages/repack/src/utils/internal/loaderChainGenerator.ts @@ -0,0 +1,74 @@ +import type { TransformOptions } from '@babel/core'; +import type { BabelPlugin } from './babelConfigAnalyzer.js'; +import type { PluginSeparationResult } from './babelPluginMapper.js'; +import { generateSwcConfig } from './swcConfigGenerator.js'; + +export interface LoaderEntry { + loader: string; + options?: any; +} + +export interface GenerateLoaderChainOptions { + projectRoot: string; + swcCompatiblePlugins: PluginSeparationResult['swcCompatible']; + babelOnlyPlugins: BabelPlugin[]; + originalBabelConfig: TransformOptions; + syntax: 'js' | 'ts'; + jsx: boolean; +} + +/** + * Generates a loader chain with SWC loader followed by Babel loader + */ +export function generateLoaderChain({ + projectRoot, + swcCompatiblePlugins, + babelOnlyPlugins, + originalBabelConfig, + syntax, + jsx, +}: GenerateLoaderChainOptions): LoaderEntry[] { + const loaders: LoaderEntry[] = []; + + // Only add SWC loader if there are compatible plugins + if (swcCompatiblePlugins.length > 0) { + const swcConfig = generateSwcConfig({ + syntax, + jsx, + swcCompatiblePlugins, + externalHelpers: true, + jsxRuntime: 'automatic', + disableImportExportTransform: false, + importSource: 'react', + lazyImports: false, + }); + + loaders.push({ + loader: 'builtin:swc-loader', + options: swcConfig, + }); + } + + // Always add Babel loader (either with remaining plugins or full config) + if (babelOnlyPlugins.length > 0 || swcCompatiblePlugins.length === 0) { + // Create a new babel config with only the remaining plugins + const babelConfig: TransformOptions = { + ...originalBabelConfig, + plugins: babelOnlyPlugins.map((plugin) => + plugin.options ? [plugin.name, plugin.options] : plugin.name + ), + // Remove presets since we've already flattened them + presets: [], + }; + + loaders.push({ + loader: '@callstack/repack/babel-loader', + options: { + projectRoot, + babelConfig, // Pass the pre-computed config + }, + }); + } + + return loaders; +} diff --git a/packages/repack/src/utils/internal/swcConfigGenerator.ts b/packages/repack/src/utils/internal/swcConfigGenerator.ts new file mode 100644 index 000000000..08b067592 --- /dev/null +++ b/packages/repack/src/utils/internal/swcConfigGenerator.ts @@ -0,0 +1,139 @@ +import type { PluginSeparationResult } from './babelPluginMapper.js'; + +interface SwcLoaderOptions { + env: { + targets: { node: number }; + include: string[]; + }; + jsc: { + assumptions: Record; + externalHelpers: boolean; + parser: { + syntax: 'ecmascript' | 'typescript'; + jsx?: boolean; + tsx?: boolean; + exportDefaultFrom?: boolean; + }; + transform: { + react: { + runtime: 'automatic' | 'classic'; + development: boolean; + importSource: string; + }; + }; + }; + module?: { + type: string; + strict: boolean; + strictMode: boolean; + noInterop: boolean; + lazy: boolean | string[]; + allowTopLevelThis: boolean; + ignoreDynamic: boolean; + }; +} + +export interface GenerateSwcConfigOptions { + syntax: 'js' | 'ts'; + jsx: boolean; + externalHelpers?: boolean; + jsxRuntime?: 'automatic' | 'classic'; + disableImportExportTransform?: boolean; + importSource?: string; + lazyImports?: boolean | string[]; + swcCompatiblePlugins: PluginSeparationResult['swcCompatible']; +} + +/** + * Generates SWC loader configuration based on compatible Babel plugins + */ +export function generateSwcConfig({ + syntax, + jsx, + externalHelpers = true, + jsxRuntime = 'automatic', + disableImportExportTransform = false, + importSource = 'react', + lazyImports = false, + swcCompatiblePlugins, +}: GenerateSwcConfigOptions): SwcLoaderOptions { + // Extract enabled transforms from compatible plugins + // SWC's env.include expects the full transform names (e.g., 'transform-classes') + const enabledTransforms = swcCompatiblePlugins.map( + ({ swcConfig }) => swcConfig.name + ); + + // Build assumptions based on plugin options + const assumptions: Record = {}; + + // Check for loose mode settings + const hasLooseClasses = swcCompatiblePlugins.some( + ({ swcConfig }) => + swcConfig.name === 'transform-class-properties' && + swcConfig.options?.loose + ); + + const hasLoosePrivateFields = swcCompatiblePlugins.some( + ({ swcConfig }) => + [ + 'transform-private-methods', + 'transform-private-property-in-object', + ].includes(swcConfig.name) && swcConfig.options?.loose + ); + + if (hasLooseClasses) { + assumptions.setPublicClassFields = true; + } + + if (hasLoosePrivateFields) { + assumptions.privateFieldsAsProperties = true; + } + + // Build parser options + const parserOptions = + syntax === 'js' + ? { + syntax: 'ecmascript' as const, + jsx, + exportDefaultFrom: true, + } + : { + syntax: 'typescript' as const, + tsx: jsx, + }; + + // Build module options + const moduleOptions = disableImportExportTransform + ? undefined + : { + type: 'commonjs', + strict: false, + strictMode: false, + noInterop: false, + lazy: lazyImports, + allowTopLevelThis: true, + ignoreDynamic: true, + }; + + return { + env: { + // Disable all transforms by default (node supports everything) + targets: { node: 24 }, + // Only include transforms that we found in the babel config + include: enabledTransforms, + }, + jsc: { + assumptions, + externalHelpers, + parser: parserOptions, + transform: { + react: { + runtime: jsxRuntime, + development: jsxRuntime === 'classic', + importSource, + }, + }, + }, + module: moduleOptions, + }; +} From 19b07fe8ebcc65935d4e18abe3d9df804a8b6d04 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 30 Jul 2025 21:25:06 +0200 Subject: [PATCH 11/61] wip --- apps/tester-app/rspack.config.mjs | 10 +- apps/tester-federation-v2/babel.config.js | 2 +- .../configs/rspack.host-app.mts | 10 +- .../commands/common/normalizeModuleRules.ts | 201 ++++++------------ .../src/loaders/babelLoader/babelLoader.ts | 1 + .../src/utils/internal/babelConfigAnalyzer.ts | 68 ------ .../src/utils/internal/babelPluginMapper.ts | 128 ----------- packages/repack/src/utils/internal/index.ts | 4 +- .../utils/internal/loaderChainGenerator.ts | 130 +++++++---- .../src/utils/internal/partitionTransforms.ts | 56 +++++ .../src/utils/internal/swcConfigGenerator.ts | 139 ------------ 11 files changed, 208 insertions(+), 541 deletions(-) delete mode 100644 packages/repack/src/utils/internal/babelConfigAnalyzer.ts delete mode 100644 packages/repack/src/utils/internal/babelPluginMapper.ts create mode 100644 packages/repack/src/utils/internal/partitionTransforms.ts delete mode 100644 packages/repack/src/utils/internal/swcConfigGenerator.ts diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 07d12c5e0..45fdfa68f 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -31,19 +31,11 @@ export default Repack.defineRspackConfig((env) => { }, module: { rules: [ - ...Repack.getJsTransformRules({ - swc: { importSource: 'nativewind' }, - flow: { enabled: false }, - codegen: { enabled: false }, - }), { test: /\.[cm]?[jt]sx?$/, use: { - loader: '@callstack/repack/babel-loader', + loader: 'repack-loader', parallel: true, - options: { - projectRoot: context, - }, }, type: 'javascript/auto', }, diff --git a/apps/tester-federation-v2/babel.config.js b/apps/tester-federation-v2/babel.config.js index 4eb77b7a4..d4461aec7 100644 --- a/apps/tester-federation-v2/babel.config.js +++ b/apps/tester-federation-v2/babel.config.js @@ -1,4 +1,4 @@ module.exports = { - // presets: ['module:@react-native/babel-preset'], + presets: ['module:@react-native/babel-preset'], comments: true, }; diff --git a/apps/tester-federation-v2/configs/rspack.host-app.mts b/apps/tester-federation-v2/configs/rspack.host-app.mts index 288c444d0..1d24d24f5 100644 --- a/apps/tester-federation-v2/configs/rspack.host-app.mts +++ b/apps/tester-federation-v2/configs/rspack.host-app.mts @@ -20,18 +20,10 @@ export default Repack.defineRspackConfig((env) => { }, module: { rules: [ - ...Repack.getJsTransformRules({ - flow: { enabled: false }, - codegen: { enabled: false }, - }), { test: /\.[cm]?[jt]sx?$/, use: { - loader: '@callstack/repack/babel-loader', - parallel: true, - options: { - projectRoot: context, - }, + loader: 'repack-loader', }, type: 'javascript/auto', }, diff --git a/packages/repack/src/commands/common/normalizeModuleRules.ts b/packages/repack/src/commands/common/normalizeModuleRules.ts index 1a3e9971e..cbd04278f 100644 --- a/packages/repack/src/commands/common/normalizeModuleRules.ts +++ b/packages/repack/src/commands/common/normalizeModuleRules.ts @@ -1,10 +1,12 @@ -import { loadOptions } from '@babel/core'; -import type { RuleSetRule } from '@rspack/core'; import { - analyzeBabelConfig, - filterTransformPlugins, + // type PluginItem, + type TransformOptions, + loadOptions, +} from '@babel/core'; +import type { RuleSetRules } from '@rspack/core'; +import { generateLoaderChain, - separateBabelPlugins, + partitionTransforms, } from '../../utils/internal/index.js'; export interface NormalizeModuleRulesOptions { @@ -13,172 +15,97 @@ export interface NormalizeModuleRulesOptions { platform: string; } -/** - * Checks if a rule contains the repack-loader placeholder - */ -function hasRepackLoader(rule: RuleSetRule): boolean { - if (!rule.use) return false; - - const uses = Array.isArray(rule.use) ? rule.use : [rule.use]; - - return uses.some((use) => { - if (typeof use === 'string') { - return use === 'repack-loader'; - } - if (typeof use === 'object' && use && 'loader' in use) { - return use.loader === 'repack-loader'; - } - return false; - }); -} - -/** - * Extracts babel config from the project - */ -function getProjectBabelConfig(projectRoot: string) { - // Try to load babel config using Babel's config resolution +function getProjectBabelConfig(projectRoot: string): TransformOptions { const babelConfig = loadOptions({ cwd: projectRoot, - filename: `${projectRoot}/dummy.js`, // Dummy filename for config resolution + root: projectRoot, }); - - return babelConfig || {}; + return babelConfig ?? {}; } -/** - * Determines the syntax and jsx settings based on the rule test pattern - */ -function determineSyntaxFromRule(rule: RuleSetRule): { - syntax: 'js' | 'ts'; - jsx: boolean; -} { - const test = rule.test; - - if (!test) { - return { syntax: 'js', jsx: false }; - } - - const testStr = test.toString(); - - // Check for TypeScript - const isTypeScript = testStr.includes('.ts') || testStr.includes('\\.ts'); +// type PluginItemWithName = PluginItem & { name: string }; - // Check for JSX/TSX - const hasJsx = - testStr.includes('.jsx') || - testStr.includes('.tsx') || - testStr.includes('\\.jsx') || - testStr.includes('\\.tsx'); - - return { - syntax: isTypeScript ? 'ts' : 'js', - jsx: hasJsx, - }; -} - -/** - * Normalizes a single rule by replacing repack-loader with SWC + Babel chain - */ -function normalizeRule( - rule: RuleSetRule, - options: NormalizeModuleRulesOptions -): RuleSetRule { - if (!hasRepackLoader(rule)) { - return rule; - } +// function filterTransformPlugins(plugins: PluginItem[]) { +// return plugins.filter((plugin): plugin is PluginItemWithName => { +// if (typeof plugin === 'object' && 'name' in plugin) { +// return Boolean(plugin.name?.startsWith('transform-')); +// } +// return false; +// }); +// } +function configureLoadersForRule(options: NormalizeModuleRulesOptions) { try { - // Get project babel configuration const babelConfig = getProjectBabelConfig(options.projectRoot); + // const transformPlugins = filterTransformPlugins(babelConfig.plugins ?? []); - // Analyze babel config to extract plugins - const analyzed = analyzeBabelConfig(babelConfig); - - // Filter to only transform plugins - const transformPlugins = filterTransformPlugins(analyzed.plugins); - - // Separate into SWC-compatible and Babel-only plugins - const separated = separateBabelPlugins(transformPlugins); + const { swcRules, babelRules } = partitionTransforms( + // @ts-ignore + babelConfig.plugins?.map((p) => p.key) ?? [] + ); - // Determine syntax from rule - const { syntax, jsx } = determineSyntaxFromRule(rule); + // console.log(swcRules, babelRules); - // Generate loader chain + // Generate loader chain for the rule.use field const loaderChain = generateLoaderChain({ projectRoot: options.projectRoot, - swcCompatiblePlugins: separated.swcCompatible, - babelOnlyPlugins: separated.babelOnly, - originalBabelConfig: analyzed.originalConfig, - syntax, - jsx, + swcRules, + babelRules, + originalBabelConfig: babelConfig, }); - // Replace the rule's use array - return { - ...rule, - use: loaderChain, - }; + return loaderChain; } catch (error) { + // TODO why would we fail? console.warn( 'Failed to normalize repack-loader, falling back to babel-loader:', error ); // Fallback to just babel-loader - return { - ...rule, - use: [ - { - loader: '@callstack/repack/babel-loader', - options: { - projectRoot: options.projectRoot, - }, - }, - ], - }; + return [ + { + loader: '@callstack/repack/babel-loader', + options: { projectRoot: options.projectRoot }, + }, + ]; } } -/** - * Normalizes module rules by replacing repack-loader placeholders with SWC + Babel chains - */ export function normalizeModuleRules( - rules: (RuleSetRule | false | null | undefined | 0 | '')[] | undefined, + rules: RuleSetRules | undefined, options: NormalizeModuleRulesOptions -): (RuleSetRule | false | null | undefined | 0 | '')[] | undefined { - if (!rules) return undefined; +): RuleSetRules { + if (!rules) { + return []; + } - const normalizedRules: (RuleSetRule | false | null | undefined | 0 | '')[] = - []; + // skip swc for webpack for now + if (options.bundler === 'webpack') { + return rules; + } - for (const rule of rules) { - // Skip falsy values - if (!rule) { - normalizedRules.push(rule); + const normalizedRules: RuleSetRules = [...rules]; + for (const rule of normalizedRules) { + if (!rule || typeof rule !== 'object') { continue; } - if (rule.oneOf) { - // Handle oneOf rules - const normalizedOneOf = rule.oneOf.map((r) => - r ? normalizeRule(r, options) : r - ); - normalizedRules.push({ - ...rule, - oneOf: normalizedOneOf, - }); - } else if (rule.rules) { - // Handle nested rules - const normalizedNested = normalizeModuleRules(rule.rules, options); - normalizedRules.push({ - ...rule, - rules: normalizedNested, - }); - } else { - // Handle regular rules - const normalized = normalizeRule(rule, options); - normalizedRules.push(normalized); + if ('use' in rule && rule.use !== undefined) { + if (typeof rule.use === 'string' && rule.use === 'repack-loader') { + rule.use = configureLoadersForRule(options); + } else if ( + typeof rule.use === 'object' && + 'loader' in rule.use && + rule.use.loader === 'repack-loader' + ) { + rule.use = undefined; + rule.rules = configureLoadersForRule(options); + } + // other cases unhandled for now } + + // if ('loader' in rule && rule.loader === 'repack-loader') { } return normalizedRules; diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index b4eea864f..c223ffe70 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -102,6 +102,7 @@ function buildBabelConfig( return { ...options.babelConfig, ...extraConfig }; } + console.log('reading config??'); // Otherwise, use the existing logic to load from project const babelRC = getBabelRC(options); diff --git a/packages/repack/src/utils/internal/babelConfigAnalyzer.ts b/packages/repack/src/utils/internal/babelConfigAnalyzer.ts deleted file mode 100644 index c503c6cc1..000000000 --- a/packages/repack/src/utils/internal/babelConfigAnalyzer.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { type TransformOptions, loadOptions } from '@babel/core'; - -export interface BabelPlugin { - name: string; - options?: any; -} - -export interface AnalyzedBabelConfig { - plugins: BabelPlugin[]; - originalConfig: TransformOptions; -} - -/** - * Analyzes a Babel configuration by loading and flattening it. - * This resolves all presets into their constituent plugins. - */ -export function analyzeBabelConfig( - babelConfig: TransformOptions -): AnalyzedBabelConfig { - // Load and flatten the babel configuration - const loadedOptions = loadOptions(babelConfig) as TransformOptions | null; - - if (!loadedOptions) { - return { - plugins: [], - originalConfig: babelConfig, - }; - } - - // Extract plugins from the flattened configuration - const plugins: BabelPlugin[] = []; - - if (loadedOptions.plugins) { - for (const plugin of loadedOptions.plugins) { - if (Array.isArray(plugin)) { - const [pluginDef, options] = plugin; - const name = - typeof pluginDef === 'string' - ? pluginDef - : (pluginDef as any)?.key || 'unknown'; - - plugins.push({ name, options }); - } else { - const name = - typeof plugin === 'string' - ? plugin - : (plugin as any)?.key || 'unknown'; - - plugins.push({ name }); - } - } - } - - return { - plugins, - originalConfig: babelConfig, - }; -} - -/** - * Filters plugins that start with 'transform-' prefix - */ -export function filterTransformPlugins(plugins: BabelPlugin[]): BabelPlugin[] { - return plugins.filter((plugin) => { - const pluginName = plugin.name.split('/').pop() || ''; - return pluginName.startsWith('transform-'); - }); -} diff --git a/packages/repack/src/utils/internal/babelPluginMapper.ts b/packages/repack/src/utils/internal/babelPluginMapper.ts deleted file mode 100644 index a58bcc354..000000000 --- a/packages/repack/src/utils/internal/babelPluginMapper.ts +++ /dev/null @@ -1,128 +0,0 @@ -import type { BabelPlugin } from './babelConfigAnalyzer.js'; - -export interface SwcTransformMapping { - swcEquivalent: string; - optionsMapper?: (babelOptions: any) => any; -} - -// Mapping of Babel transform plugins to SWC equivalents -// Note: SWC uses the same names as Babel plugins in the env.include array -const BABEL_TO_SWC_MAPPINGS: Record = { - 'transform-block-scoping': { - swcEquivalent: 'transform-block-scoping', - }, - 'transform-class-properties': { - swcEquivalent: 'transform-class-properties', - optionsMapper: (options) => ({ - loose: options?.loose ?? true, // React Native default - }), - }, - 'transform-private-methods': { - swcEquivalent: 'transform-private-methods', - optionsMapper: (options) => ({ - loose: options?.loose ?? true, - }), - }, - 'transform-private-property-in-object': { - swcEquivalent: 'transform-private-property-in-object', - optionsMapper: (options) => ({ - loose: options?.loose ?? true, - }), - }, - 'transform-classes': { - swcEquivalent: 'transform-classes', - optionsMapper: (options) => ({ - loose: options?.loose ?? false, - }), - }, - 'transform-destructuring': { - swcEquivalent: 'transform-destructuring', - optionsMapper: (options) => ({ - loose: options?.loose ?? false, - }), - }, - 'transform-async-to-generator': { - swcEquivalent: 'transform-async-to-generator', - }, - 'transform-async-generator-functions': { - swcEquivalent: 'transform-async-generator-functions', - }, - 'transform-unicode-regex': { - swcEquivalent: 'transform-unicode-regex', - }, - 'transform-named-capturing-groups-regex': { - swcEquivalent: 'transform-named-capturing-groups-regex', - }, - 'transform-optional-chaining': { - swcEquivalent: 'transform-optional-chaining', - optionsMapper: (options) => ({ - loose: options?.loose ?? false, - }), - }, - 'transform-spread': { - swcEquivalent: 'transform-spread', - optionsMapper: (options) => ({ - loose: options?.loose ?? false, - }), - }, - 'transform-object-rest-spread': { - swcEquivalent: 'transform-object-rest-spread', - optionsMapper: (options) => ({ - loose: options?.loose ?? false, - useBuiltIns: options?.useBuiltIns ?? false, - }), - }, - 'transform-class-static-block': { - swcEquivalent: 'transform-class-static-block', - }, - 'transform-parameters': { - swcEquivalent: 'transform-parameters', - optionsMapper: (options) => ({ - loose: options?.loose ?? false, - }), - }, - 'transform-function-name': { - swcEquivalent: 'transform-function-name', - }, -}; - -export interface PluginSeparationResult { - swcCompatible: Array<{ - plugin: BabelPlugin; - swcConfig: any; - }>; - babelOnly: BabelPlugin[]; -} - -/** - * Separates Babel plugins into SWC-compatible and Babel-only groups - */ -export function separateBabelPlugins( - plugins: BabelPlugin[] -): PluginSeparationResult { - const swcCompatible: PluginSeparationResult['swcCompatible'] = []; - const babelOnly: BabelPlugin[] = []; - - for (const plugin of plugins) { - const pluginName = plugin.name.split('/').pop() || ''; - const mapping = BABEL_TO_SWC_MAPPINGS[pluginName]; - - if (mapping) { - const swcConfig = mapping.optionsMapper - ? mapping.optionsMapper(plugin.options) - : {}; - - swcCompatible.push({ - plugin, - swcConfig: { - name: mapping.swcEquivalent, - options: swcConfig, - }, - }); - } else { - babelOnly.push(plugin); - } - } - - return { swcCompatible, babelOnly }; -} diff --git a/packages/repack/src/utils/internal/index.ts b/packages/repack/src/utils/internal/index.ts index 289a3d92a..8721a69d6 100644 --- a/packages/repack/src/utils/internal/index.ts +++ b/packages/repack/src/utils/internal/index.ts @@ -1,4 +1,2 @@ -export * from './babelConfigAnalyzer.js'; -export * from './babelPluginMapper.js'; -export * from './swcConfigGenerator.js'; +export * from './partitionTransforms.js'; export * from './loaderChainGenerator.js'; diff --git a/packages/repack/src/utils/internal/loaderChainGenerator.ts b/packages/repack/src/utils/internal/loaderChainGenerator.ts index 17e6d4e30..3bcc6f734 100644 --- a/packages/repack/src/utils/internal/loaderChainGenerator.ts +++ b/packages/repack/src/utils/internal/loaderChainGenerator.ts @@ -1,7 +1,6 @@ import type { TransformOptions } from '@babel/core'; -import type { BabelPlugin } from './babelConfigAnalyzer.js'; -import type { PluginSeparationResult } from './babelPluginMapper.js'; -import { generateSwcConfig } from './swcConfigGenerator.js'; +import { getJsTransformRules } from '../getJsTransformRules.js'; +import type { RulePartitionResult } from './partitionTransforms.js'; export interface LoaderEntry { loader: string; @@ -10,65 +9,102 @@ export interface LoaderEntry { export interface GenerateLoaderChainOptions { projectRoot: string; - swcCompatiblePlugins: PluginSeparationResult['swcCompatible']; - babelOnlyPlugins: BabelPlugin[]; + swcRules: RulePartitionResult['swcRules']; + babelRules: RulePartitionResult['babelRules']; originalBabelConfig: TransformOptions; - syntax: 'js' | 'ts'; - jsx: boolean; } -/** - * Generates a loader chain with SWC loader followed by Babel loader - */ +function getSwcEnvironmentPreset(transforms: string[]) { + console.log(transforms); + return { + // disable all transforms (node supports everything) + targets: { node: 24 }, + // add transforms manually that match the RN preset + include: transforms, + }; +} + export function generateLoaderChain({ projectRoot, - swcCompatiblePlugins, - babelOnlyPlugins, + swcRules, + babelRules, originalBabelConfig, - syntax, - jsx, }: GenerateLoaderChainOptions): LoaderEntry[] { const loaders: LoaderEntry[] = []; + const swcEnvPreset = getSwcEnvironmentPreset(swcRules); // Only add SWC loader if there are compatible plugins - if (swcCompatiblePlugins.length > 0) { - const swcConfig = generateSwcConfig({ - syntax, - jsx, - swcCompatiblePlugins, - externalHelpers: true, - jsxRuntime: 'automatic', - disableImportExportTransform: false, - importSource: 'react', - lazyImports: false, - }); - - loaders.push({ - loader: 'builtin:swc-loader', - options: swcConfig, + if (swcRules.length > 0) { + const swcLoaderRules = getJsTransformRules({ + codegen: { enabled: false }, + flow: { enabled: false }, + }).map((rule) => { + const newRule = { ...rule }; + if ('oneOf' in rule && 'oneOf' in newRule) { + newRule.oneOf = rule.oneOf.map((oneOfRule) => { + if (oneOfRule.use.loader !== 'builtin:swc-loader') { + return oneOfRule; + } + const options = oneOfRule.use.options; + oneOfRule.use.options = { + ...options, + env: swcEnvPreset, + jsc: { + ...options.jsc, + assumptions: { + ...options.jsc.assumptions, + }, + }, + }; + return oneOfRule; + }); + } + return newRule; }); + // @ts-ignore this is just one swc rule with oneOf field + loaders.push(...swcLoaderRules); } + const newBabelPlugins = originalBabelConfig.plugins + ?.filter( + // @ts-ignore + (plugin) => !swcRules.includes(plugin.key) + ) + .filter( + (p) => + ![ + 'transform-runtime', + 'transform-react-jsx-self', + 'transform-react-jsx-source', + 'transform-modules-commonjs', + 'transform-nullish-coalescing-operator', + 'transform-logical-assignment-operators', + 'transform-sticky-regex', + 'transform-literals', + 'transform-optional-catch-binding', + 'transform-arrow-functions', + 'transform-numeric-separator', + 'transform-shorthand-properties', + 'transform-react-jsx', + 'transform-class-properties', + 'proposal-export-default-from', + 'transform-computed-properties', + // @ts-ignore + ].includes(p.key) + ); + + console.log(newBabelPlugins); // Always add Babel loader (either with remaining plugins or full config) - if (babelOnlyPlugins.length > 0 || swcCompatiblePlugins.length === 0) { - // Create a new babel config with only the remaining plugins - const babelConfig: TransformOptions = { - ...originalBabelConfig, - plugins: babelOnlyPlugins.map((plugin) => - plugin.options ? [plugin.name, plugin.options] : plugin.name - ), - // Remove presets since we've already flattened them - presets: [], - }; + // Create a new babel config with only the remaining plugins + const babelConfig: TransformOptions = { + ...originalBabelConfig, + plugins: newBabelPlugins, + }; - loaders.push({ - loader: '@callstack/repack/babel-loader', - options: { - projectRoot, - babelConfig, // Pass the pre-computed config - }, - }); - } + loaders.push({ + loader: '@callstack/repack/babel-loader', + options: { projectRoot, babelConfig }, + }); return loaders; } diff --git a/packages/repack/src/utils/internal/partitionTransforms.ts b/packages/repack/src/utils/internal/partitionTransforms.ts new file mode 100644 index 000000000..cccfc348e --- /dev/null +++ b/packages/repack/src/utils/internal/partitionTransforms.ts @@ -0,0 +1,56 @@ +export interface RulePartitionResult { + swcRules: string[]; + babelRules: string[]; +} + +const SWC_SUPPORTED_RULES = [ + 'transform-block-scoping', + // 'transform-class-properties', + 'transform-private-methods', + 'transform-private-property-in-object', + 'transform-classes', + 'transform-destructuring', + 'transform-async-to-generator', + 'transform-async-generator-functions', + 'transform-unicode-regex', + 'transform-named-capturing-groups-regex', + 'transform-optional-chaining', + 'transform-spread', + 'transform-object-rest-spread', + 'transform-class-static-block', + 'transform-parameters', + 'transform-function-name', + 'transform-nullish-coalescing-operator', + 'transform-logical-assignment-operators', + 'transform-sticky-regex', + 'transform-literals', + 'transform-optional-catch-binding', + 'transform-arrow-functions', + 'transform-numeric-separator', + 'transform-shorthand-properties', + 'transform-computed-properties', +]; + +function getSwcRuleName(babelTransformName: string): string | null { + // all swc rules are named the same as the babel transforms + // we just check if the transform is supported by swc + if (SWC_SUPPORTED_RULES.includes(babelTransformName)) { + return babelTransformName; + } + return null; +} + +export function partitionTransforms(transforms: string[]): RulePartitionResult { + return transforms.reduce( + (result, transformName) => { + const swcRuleName = getSwcRuleName(transformName); + if (swcRuleName !== null) { + result.swcRules.push(swcRuleName); + } else { + result.babelRules.push(transformName); + } + return result; + }, + { swcRules: [] as string[], babelRules: [] as string[] } + ); +} diff --git a/packages/repack/src/utils/internal/swcConfigGenerator.ts b/packages/repack/src/utils/internal/swcConfigGenerator.ts deleted file mode 100644 index 08b067592..000000000 --- a/packages/repack/src/utils/internal/swcConfigGenerator.ts +++ /dev/null @@ -1,139 +0,0 @@ -import type { PluginSeparationResult } from './babelPluginMapper.js'; - -interface SwcLoaderOptions { - env: { - targets: { node: number }; - include: string[]; - }; - jsc: { - assumptions: Record; - externalHelpers: boolean; - parser: { - syntax: 'ecmascript' | 'typescript'; - jsx?: boolean; - tsx?: boolean; - exportDefaultFrom?: boolean; - }; - transform: { - react: { - runtime: 'automatic' | 'classic'; - development: boolean; - importSource: string; - }; - }; - }; - module?: { - type: string; - strict: boolean; - strictMode: boolean; - noInterop: boolean; - lazy: boolean | string[]; - allowTopLevelThis: boolean; - ignoreDynamic: boolean; - }; -} - -export interface GenerateSwcConfigOptions { - syntax: 'js' | 'ts'; - jsx: boolean; - externalHelpers?: boolean; - jsxRuntime?: 'automatic' | 'classic'; - disableImportExportTransform?: boolean; - importSource?: string; - lazyImports?: boolean | string[]; - swcCompatiblePlugins: PluginSeparationResult['swcCompatible']; -} - -/** - * Generates SWC loader configuration based on compatible Babel plugins - */ -export function generateSwcConfig({ - syntax, - jsx, - externalHelpers = true, - jsxRuntime = 'automatic', - disableImportExportTransform = false, - importSource = 'react', - lazyImports = false, - swcCompatiblePlugins, -}: GenerateSwcConfigOptions): SwcLoaderOptions { - // Extract enabled transforms from compatible plugins - // SWC's env.include expects the full transform names (e.g., 'transform-classes') - const enabledTransforms = swcCompatiblePlugins.map( - ({ swcConfig }) => swcConfig.name - ); - - // Build assumptions based on plugin options - const assumptions: Record = {}; - - // Check for loose mode settings - const hasLooseClasses = swcCompatiblePlugins.some( - ({ swcConfig }) => - swcConfig.name === 'transform-class-properties' && - swcConfig.options?.loose - ); - - const hasLoosePrivateFields = swcCompatiblePlugins.some( - ({ swcConfig }) => - [ - 'transform-private-methods', - 'transform-private-property-in-object', - ].includes(swcConfig.name) && swcConfig.options?.loose - ); - - if (hasLooseClasses) { - assumptions.setPublicClassFields = true; - } - - if (hasLoosePrivateFields) { - assumptions.privateFieldsAsProperties = true; - } - - // Build parser options - const parserOptions = - syntax === 'js' - ? { - syntax: 'ecmascript' as const, - jsx, - exportDefaultFrom: true, - } - : { - syntax: 'typescript' as const, - tsx: jsx, - }; - - // Build module options - const moduleOptions = disableImportExportTransform - ? undefined - : { - type: 'commonjs', - strict: false, - strictMode: false, - noInterop: false, - lazy: lazyImports, - allowTopLevelThis: true, - ignoreDynamic: true, - }; - - return { - env: { - // Disable all transforms by default (node supports everything) - targets: { node: 24 }, - // Only include transforms that we found in the babel config - include: enabledTransforms, - }, - jsc: { - assumptions, - externalHelpers, - parser: parserOptions, - transform: { - react: { - runtime: jsxRuntime, - development: jsxRuntime === 'classic', - importSource, - }, - }, - }, - module: moduleOptions, - }; -} From ef8bc68f4b46acd8f6e21a6f34a91d635fd467f9 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 31 Jul 2025 15:57:36 +0200 Subject: [PATCH 12/61] feat: working initial prototype --- .../configs/rspack.host-app.mts | 4 +- .../commands/common/normalizeModuleRules.ts | 42 +++++----- .../src/loaders/babelLoader/babelLoader.ts | 59 +++++++------ .../repack/src/loaders/babelLoader/options.ts | 12 ++- .../repack/src/loaders/babelLoader/preset.ts | 33 -------- .../repack/src/utils/getSwcLoaderOptions.ts | 2 +- .../internal/getSupportedSwcTransforms.ts | 40 +++++++++ packages/repack/src/utils/internal/index.ts | 2 +- .../utils/internal/loaderChainGenerator.ts | 82 +++++++++---------- .../src/utils/internal/partitionTransforms.ts | 56 ------------- 10 files changed, 143 insertions(+), 189 deletions(-) delete mode 100644 packages/repack/src/loaders/babelLoader/preset.ts create mode 100644 packages/repack/src/utils/internal/getSupportedSwcTransforms.ts delete mode 100644 packages/repack/src/utils/internal/partitionTransforms.ts diff --git a/apps/tester-federation-v2/configs/rspack.host-app.mts b/apps/tester-federation-v2/configs/rspack.host-app.mts index 1d24d24f5..e9fb2fa89 100644 --- a/apps/tester-federation-v2/configs/rspack.host-app.mts +++ b/apps/tester-federation-v2/configs/rspack.host-app.mts @@ -22,9 +22,7 @@ export default Repack.defineRspackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: { - loader: 'repack-loader', - }, + use: 'repack-loader', type: 'javascript/auto', }, ...Repack.getAssetTransformRules(), diff --git a/packages/repack/src/commands/common/normalizeModuleRules.ts b/packages/repack/src/commands/common/normalizeModuleRules.ts index cbd04278f..9300bb47a 100644 --- a/packages/repack/src/commands/common/normalizeModuleRules.ts +++ b/packages/repack/src/commands/common/normalizeModuleRules.ts @@ -6,7 +6,7 @@ import { import type { RuleSetRules } from '@rspack/core'; import { generateLoaderChain, - partitionTransforms, + getSupportedSwcTransforms, } from '../../utils/internal/index.js'; export interface NormalizeModuleRulesOptions { @@ -15,7 +15,21 @@ export interface NormalizeModuleRulesOptions { platform: string; } -function getProjectBabelConfig(projectRoot: string): TransformOptions { +interface BabelProjectConfig extends TransformOptions { + plugins?: { + key: string; + manipulateOptions: (() => void) | undefined; + post: (() => void) | undefined; + pre: (() => void) | undefined; + visitor: unknown; + parserOverride: unknown; + generatorOverride: undefined; + options: Record; + externalDependencies: unknown[]; + }[]; +} + +function getProjectBabelConfig(projectRoot: string): BabelProjectConfig { const babelConfig = loadOptions({ cwd: projectRoot, root: projectRoot, @@ -23,34 +37,18 @@ function getProjectBabelConfig(projectRoot: string): TransformOptions { return babelConfig ?? {}; } -// type PluginItemWithName = PluginItem & { name: string }; - -// function filterTransformPlugins(plugins: PluginItem[]) { -// return plugins.filter((plugin): plugin is PluginItemWithName => { -// if (typeof plugin === 'object' && 'name' in plugin) { -// return Boolean(plugin.name?.startsWith('transform-')); -// } -// return false; -// }); -// } - function configureLoadersForRule(options: NormalizeModuleRulesOptions) { try { const babelConfig = getProjectBabelConfig(options.projectRoot); - // const transformPlugins = filterTransformPlugins(babelConfig.plugins ?? []); - const { swcRules, babelRules } = partitionTransforms( - // @ts-ignore + const supportedSwcTransforms = getSupportedSwcTransforms( babelConfig.plugins?.map((p) => p.key) ?? [] ); - // console.log(swcRules, babelRules); - // Generate loader chain for the rule.use field const loaderChain = generateLoaderChain({ projectRoot: options.projectRoot, - swcRules, - babelRules, + swcRules: supportedSwcTransforms, originalBabelConfig: babelConfig, }); @@ -66,6 +64,7 @@ function configureLoadersForRule(options: NormalizeModuleRulesOptions) { return [ { loader: '@callstack/repack/babel-loader', + parallel: true, options: { projectRoot: options.projectRoot }, }, ]; @@ -93,7 +92,8 @@ export function normalizeModuleRules( if ('use' in rule && rule.use !== undefined) { if (typeof rule.use === 'string' && rule.use === 'repack-loader') { - rule.use = configureLoadersForRule(options); + rule.use = undefined; + rule.rules = configureLoadersForRule(options); } else if ( typeof rule.use === 'object' && 'loader' in rule.use && diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index c223ffe70..69cf19ceb 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -3,6 +3,7 @@ import path from 'node:path'; import { type Node, type TransformOptions, + loadOptions, parseSync, transformFromAstSync, } from '@babel/core'; @@ -11,7 +12,6 @@ import * as hermesParser from 'hermes-parser'; import type { LoaderContext } from '@rspack/core'; import { type BabelLoaderOptions, getOptions } from './options.js'; -import { repackBabelPreset } from './preset.js'; export const raw = false; @@ -26,15 +26,15 @@ function isTSXSource(fileName: string) { interface CustomOptions { enableBabelRCLookup?: boolean; extendsBabelConfigPath?: string; + excludePlugins?: string[]; projectRoot: string; - babelConfig?: TransformOptions; } /** * Return a memoized function that checks for the existence of a * project level .babelrc file, and if it doesn't exist, reads the * default RN babelrc file and uses that. */ -const getBabelRC = (() => { +const _getBabelRC = (() => { let babelRC: TransformOptions | null = null; return function _getBabelRC({ @@ -87,25 +87,6 @@ function buildBabelConfig( filename: string, options: CustomOptions ): TransformOptions { - // If a pre-computed babel config is provided, use it directly - if (options.babelConfig) { - const extraConfig: TransformOptions = { - code: true, - cwd: options.projectRoot, - filename, - highlightCode: true, - compact: false, - comments: true, - minified: false, - }; - - return { ...options.babelConfig, ...extraConfig }; - } - - console.log('reading config??'); - // Otherwise, use the existing logic to load from project - const babelRC = getBabelRC(options); - const extraConfig: TransformOptions = { babelrc: options.enableBabelRCLookup ?? true, code: true, @@ -115,10 +96,38 @@ function buildBabelConfig( compact: false, comments: true, minified: false, - presets: [repackBabelPreset], + plugins: [], }; - return { ...babelRC, ...extraConfig }; + if (isTypeScriptSource(filename)) { + extraConfig.plugins!.push([ + '@babel/plugin-syntax-typescript', + { isTSX: false, allowNamespaces: true }, + ]); + } + + if (isTSXSource(filename)) { + extraConfig.plugins!.push([ + '@babel/plugin-syntax-typescript', + { isTSX: true, allowNamespaces: true }, + ]); + } + + const babelConfig = loadOptions(extraConfig) as any; + + if (options.excludePlugins) { + babelConfig.plugins = babelConfig.plugins.filter( + (plugin: { key: string }) => { + return !options.excludePlugins!.includes(plugin.key); + } + ); + } + + babelConfig.plugins.forEach((plugin: any) => { + console.log(plugin.key); + }); + + return babelConfig; } const transform = ({ @@ -166,10 +175,10 @@ export default function babelLoader( src: source, options: { enableBabelRCLookup: true, + excludePlugins: options.excludePlugins, // this is currently broken in Rspack and needs to be fixed upstream // for now we can pass this as an option to loader projectRoot: options.projectRoot, - babelConfig: options.babelConfig, }, }); // @ts-ignore diff --git a/packages/repack/src/loaders/babelLoader/options.ts b/packages/repack/src/loaders/babelLoader/options.ts index 7a65f6cd0..c0033cb2e 100644 --- a/packages/repack/src/loaders/babelLoader/options.ts +++ b/packages/repack/src/loaders/babelLoader/options.ts @@ -1,10 +1,9 @@ -import type { TransformOptions } from '@babel/core'; import type { LoaderContext } from '@rspack/core'; import type { validate } from 'schema-utils'; export interface BabelLoaderOptions { + excludePlugins?: string[]; projectRoot: string; - babelConfig?: TransformOptions; } type Schema = Parameters[0]; @@ -13,8 +12,13 @@ export const optionsSchema: Schema = { type: 'object', required: ['projectRoot'], properties: { - projectRoot: { type: 'string' }, - babelConfig: { type: 'object' }, + projectRoot: { + type: 'string', + }, + excludePlugins: { + type: 'array', + items: { type: 'string' }, + }, }, }; diff --git a/packages/repack/src/loaders/babelLoader/preset.ts b/packages/repack/src/loaders/babelLoader/preset.ts deleted file mode 100644 index abf505523..000000000 --- a/packages/repack/src/loaders/babelLoader/preset.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { TransformOptions } from '@babel/core'; - -export const repackBabelPreset: TransformOptions = { - plugins: [ - ['@babel/plugin-syntax-typescript', false], - ['@react-native/babel-plugin-codegen', false], - '@babel/plugin-transform-flow-strip-types', - ], - overrides: [ - { - test: /(?:^|[\\/])(?:Native\w+|(\w+)NativeComponent)\.[jt]sx?$/, - plugins: ['@react-native/babel-plugin-codegen'], - }, - { - test: /\.ts$/, - plugins: [ - [ - '@babel/plugin-syntax-typescript', - { isTSX: false, allowNamespaces: true }, - ], - ], - }, - { - test: /\.tsx$/, - plugins: [ - [ - '@babel/plugin-syntax-typescript', - { isTSX: true, allowNamespaces: true }, - ], - ], - }, - ], -}; diff --git a/packages/repack/src/utils/getSwcLoaderOptions.ts b/packages/repack/src/utils/getSwcLoaderOptions.ts index d337f8a31..c8652c8d5 100644 --- a/packages/repack/src/utils/getSwcLoaderOptions.ts +++ b/packages/repack/src/utils/getSwcLoaderOptions.ts @@ -28,7 +28,7 @@ function getEnvironmentPreset() { }; } -function getCompilerAssumptions() { +function getCompilerAssumptions(): Record { return { // Loose mode for: transform-class-properties setPublicClassFields: true, diff --git a/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts b/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts new file mode 100644 index 000000000..f4a0eb74e --- /dev/null +++ b/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts @@ -0,0 +1,40 @@ +const SWC_SUPPORTED_RULES = new Set([ + 'transform-block-scoping', + 'transform-classes', + 'transform-class-static-block', + 'transform-class-properties', // TODO: currently bugged in swc + 'transform-private-property-in-object', + 'transform-private-methods', // TODO: currently bugged in swc + 'transform-destructuring', + 'transform-async-to-generator', + 'transform-async-generator-functions', + 'transform-unicode-regex', + 'transform-named-capturing-groups-regex', + 'transform-optional-chaining', + 'transform-spread', + 'transform-object-rest-spread', + 'transform-parameters', + 'transform-function-name', + 'transform-nullish-coalescing-operator', + 'transform-logical-assignment-operators', + 'transform-sticky-regex', + 'transform-literals', + 'transform-optional-catch-binding', + 'transform-arrow-functions', + 'transform-numeric-separator', + 'transform-shorthand-properties', + 'transform-computed-properties', +]); + +function isSupportedTransform(transform: string): boolean { + return SWC_SUPPORTED_RULES.has(transform); +} + +function getSwcRuleName(babelTransformName: string): string { + // all swc rules are named the same as the babel transforms + return babelTransformName; +} + +export function getSupportedSwcTransforms(transforms: string[]) { + return transforms.filter(isSupportedTransform).map(getSwcRuleName); +} diff --git a/packages/repack/src/utils/internal/index.ts b/packages/repack/src/utils/internal/index.ts index 8721a69d6..49e687260 100644 --- a/packages/repack/src/utils/internal/index.ts +++ b/packages/repack/src/utils/internal/index.ts @@ -1,2 +1,2 @@ -export * from './partitionTransforms.js'; +export * from './getSupportedSwcTransforms.js'; export * from './loaderChainGenerator.js'; diff --git a/packages/repack/src/utils/internal/loaderChainGenerator.ts b/packages/repack/src/utils/internal/loaderChainGenerator.ts index 3bcc6f734..1339911bf 100644 --- a/packages/repack/src/utils/internal/loaderChainGenerator.ts +++ b/packages/repack/src/utils/internal/loaderChainGenerator.ts @@ -1,21 +1,19 @@ import type { TransformOptions } from '@babel/core'; import { getJsTransformRules } from '../getJsTransformRules.js'; -import type { RulePartitionResult } from './partitionTransforms.js'; export interface LoaderEntry { loader: string; + parallel?: boolean; options?: any; } export interface GenerateLoaderChainOptions { projectRoot: string; - swcRules: RulePartitionResult['swcRules']; - babelRules: RulePartitionResult['babelRules']; + swcRules: string[]; originalBabelConfig: TransformOptions; } function getSwcEnvironmentPreset(transforms: string[]) { - console.log(transforms); return { // disable all transforms (node supports everything) targets: { node: 24 }, @@ -27,8 +25,6 @@ function getSwcEnvironmentPreset(transforms: string[]) { export function generateLoaderChain({ projectRoot, swcRules, - babelRules, - originalBabelConfig, }: GenerateLoaderChainOptions): LoaderEntry[] { const loaders: LoaderEntry[] = []; @@ -41,6 +37,8 @@ export function generateLoaderChain({ }).map((rule) => { const newRule = { ...rule }; if ('oneOf' in rule && 'oneOf' in newRule) { + // @ts-ignore + newRule.test = undefined; newRule.oneOf = rule.oneOf.map((oneOfRule) => { if (oneOfRule.use.loader !== 'builtin:swc-loader') { return oneOfRule; @@ -48,11 +46,19 @@ export function generateLoaderChain({ const options = oneOfRule.use.options; oneOfRule.use.options = { ...options, - env: swcEnvPreset, + // @ts-ignore + env: { ...swcEnvPreset, forceAllTransforms: false }, jsc: { ...options.jsc, assumptions: { - ...options.jsc.assumptions, + // nullish-coalescing-operator && optional-chaining loose mode + noDocumentAll: true, + // transform-class-properties loose mode + setPublicClassFields: true, + // object-rest-spread loose mode + setSpreadProperties: true, + // transform-private-methods loose mode + privateFieldsAsProperties: true, }, }, }; @@ -65,45 +71,31 @@ export function generateLoaderChain({ loaders.push(...swcLoaderRules); } - const newBabelPlugins = originalBabelConfig.plugins - ?.filter( - // @ts-ignore - (plugin) => !swcRules.includes(plugin.key) - ) - .filter( - (p) => - ![ - 'transform-runtime', - 'transform-react-jsx-self', - 'transform-react-jsx-source', - 'transform-modules-commonjs', - 'transform-nullish-coalescing-operator', - 'transform-logical-assignment-operators', - 'transform-sticky-regex', - 'transform-literals', - 'transform-optional-catch-binding', - 'transform-arrow-functions', - 'transform-numeric-separator', - 'transform-shorthand-properties', - 'transform-react-jsx', - 'transform-class-properties', - 'proposal-export-default-from', - 'transform-computed-properties', - // @ts-ignore - ].includes(p.key) - ); - - console.log(newBabelPlugins); - // Always add Babel loader (either with remaining plugins or full config) - // Create a new babel config with only the remaining plugins - const babelConfig: TransformOptions = { - ...originalBabelConfig, - plugins: newBabelPlugins, - }; + const excludePlugins = [ + ...swcRules, + // handled by swc jsc.externalHelpers + 'transform-runtime', + // handled by swc jsc.transform.react.development + 'transform-react-jsx-self', + 'transform-react-jsx-source', + // handled by swc module.type + 'transform-modules-commonjs', + // handled by swc jsc.transform.react.runtime + 'transform-react-jsx', + // handled by swc jsc.parser.exportDefaultFrom + 'proposal-export-default-from', + // handled by swc + 'transform-typescript', + ]; loaders.push({ - loader: '@callstack/repack/babel-loader', - options: { projectRoot, babelConfig }, + // @ts-ignore + type: 'javascript/auto', + use: { + loader: '@callstack/repack/babel-loader', + parallel: true, + options: { excludePlugins, projectRoot }, + }, }); return loaders; diff --git a/packages/repack/src/utils/internal/partitionTransforms.ts b/packages/repack/src/utils/internal/partitionTransforms.ts deleted file mode 100644 index cccfc348e..000000000 --- a/packages/repack/src/utils/internal/partitionTransforms.ts +++ /dev/null @@ -1,56 +0,0 @@ -export interface RulePartitionResult { - swcRules: string[]; - babelRules: string[]; -} - -const SWC_SUPPORTED_RULES = [ - 'transform-block-scoping', - // 'transform-class-properties', - 'transform-private-methods', - 'transform-private-property-in-object', - 'transform-classes', - 'transform-destructuring', - 'transform-async-to-generator', - 'transform-async-generator-functions', - 'transform-unicode-regex', - 'transform-named-capturing-groups-regex', - 'transform-optional-chaining', - 'transform-spread', - 'transform-object-rest-spread', - 'transform-class-static-block', - 'transform-parameters', - 'transform-function-name', - 'transform-nullish-coalescing-operator', - 'transform-logical-assignment-operators', - 'transform-sticky-regex', - 'transform-literals', - 'transform-optional-catch-binding', - 'transform-arrow-functions', - 'transform-numeric-separator', - 'transform-shorthand-properties', - 'transform-computed-properties', -]; - -function getSwcRuleName(babelTransformName: string): string | null { - // all swc rules are named the same as the babel transforms - // we just check if the transform is supported by swc - if (SWC_SUPPORTED_RULES.includes(babelTransformName)) { - return babelTransformName; - } - return null; -} - -export function partitionTransforms(transforms: string[]): RulePartitionResult { - return transforms.reduce( - (result, transformName) => { - const swcRuleName = getSwcRuleName(transformName); - if (swcRuleName !== null) { - result.swcRules.push(swcRuleName); - } else { - result.babelRules.push(transformName); - } - return result; - }, - { swcRules: [] as string[], babelRules: [] as string[] } - ); -} From 800e9946a33ec068fefcaeced0a0ddf362b2309d Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 31 Jul 2025 16:18:34 +0200 Subject: [PATCH 13/61] fix: disable broken rules --- apps/tester-app/babel.config.js | 1 + apps/tester-app/rspack.config.mjs | 1 - packages/repack/src/loaders/babelLoader/babelLoader.ts | 6 +++--- .../repack/src/utils/internal/getSupportedSwcTransforms.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/tester-app/babel.config.js b/apps/tester-app/babel.config.js index be6a49f55..054c21b28 100644 --- a/apps/tester-app/babel.config.js +++ b/apps/tester-app/babel.config.js @@ -1,4 +1,5 @@ module.exports = { + presets: ['@react-native/babel-preset'], plugins: [ [ '@babel/plugin-transform-react-jsx', diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 45fdfa68f..29197eb74 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -35,7 +35,6 @@ export default Repack.defineRspackConfig((env) => { test: /\.[cm]?[jt]sx?$/, use: { loader: 'repack-loader', - parallel: true, }, type: 'javascript/auto', }, diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 69cf19ceb..9de5b6d7e 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -123,9 +123,9 @@ function buildBabelConfig( ); } - babelConfig.plugins.forEach((plugin: any) => { - console.log(plugin.key); - }); + // babelConfig.plugins.forEach((plugin: any) => { + // console.log(plugin.key); + // }); return babelConfig; } diff --git a/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts b/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts index f4a0eb74e..ec7802df3 100644 --- a/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts +++ b/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts @@ -2,9 +2,9 @@ const SWC_SUPPORTED_RULES = new Set([ 'transform-block-scoping', 'transform-classes', 'transform-class-static-block', - 'transform-class-properties', // TODO: currently bugged in swc + // 'transform-class-properties', // TODO: currently bugged in swc 'transform-private-property-in-object', - 'transform-private-methods', // TODO: currently bugged in swc + // 'transform-private-methods', // TODO: currently bugged in swc 'transform-destructuring', 'transform-async-to-generator', 'transform-async-generator-functions', From 75ba13865ce95d992682636f4219e970d80833b7 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 31 Jul 2025 17:58:05 +0200 Subject: [PATCH 14/61] chore: cleanup --- apps/tester-app/rspack.config.mjs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 29197eb74..ee0178448 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -33,9 +33,7 @@ export default Repack.defineRspackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: { - loader: 'repack-loader', - }, + use: 'repack-loader', type: 'javascript/auto', }, { From f59948693d84d8c30b3e51a6e8554439964a2ad4 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 1 Aug 2025 16:38:51 +0200 Subject: [PATCH 15/61] feat: hybrid js loader --- packages/repack/package.json | 1 + .../common/config/makeCompilerConfig.ts | 2 - .../commands/common/config/normalizeConfig.ts | 19 +- .../commands/common/normalizeModuleRules.ts | 112 ------ .../src/loaders/babelLoader/babelLoader.ts | 26 +- .../repack/src/loaders/babelLoader/index.ts | 4 +- .../loaders/hybridJsLoader/hybridJsLoader.ts | 90 +++++ .../src/loaders/hybridJsLoader/index.ts | 4 + .../src/loaders/hybridJsLoader/options.ts | 38 ++ .../src/loaders/hybridJsLoader/utilts.ts | 17 + packages/repack/src/types/babel-core.d.ts | 21 ++ .../internal/getSupportedSwcTransforms.ts | 40 --- packages/repack/src/utils/internal/index.ts | 3 +- .../utils/internal/loaderChainGenerator.ts | 102 ------ packages/repack/src/utils/internal/swc.ts | 326 ++++++++++++++++++ 15 files changed, 510 insertions(+), 295 deletions(-) delete mode 100644 packages/repack/src/commands/common/normalizeModuleRules.ts create mode 100644 packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts create mode 100644 packages/repack/src/loaders/hybridJsLoader/index.ts create mode 100644 packages/repack/src/loaders/hybridJsLoader/options.ts create mode 100644 packages/repack/src/loaders/hybridJsLoader/utilts.ts create mode 100644 packages/repack/src/types/babel-core.d.ts delete mode 100644 packages/repack/src/utils/internal/getSupportedSwcTransforms.ts delete mode 100644 packages/repack/src/utils/internal/loaderChainGenerator.ts create mode 100644 packages/repack/src/utils/internal/swc.ts diff --git a/packages/repack/package.json b/packages/repack/package.json index 0cc3850f6..73d1d517b 100644 --- a/packages/repack/package.json +++ b/packages/repack/package.json @@ -12,6 +12,7 @@ "./assets-loader": "./dist/loaders/assetsLoader/index.js", "./babel-loader": "./dist/loaders/babelLoader/index.js", "./flow-loader": "./dist/loaders/flowLoader/index.js", + "./hybrid-js-loader": "./dist/loaders/hybridJsLoader/index.js", "./react-refresh-loader": "./dist/loaders/reactRefreshLoader/index.js", "./mf/*": "./mf/*.js", "./package.json": "./package.json" diff --git a/packages/repack/src/commands/common/config/makeCompilerConfig.ts b/packages/repack/src/commands/common/config/makeCompilerConfig.ts index b3988a3d2..fbbea57fd 100644 --- a/packages/repack/src/commands/common/config/makeCompilerConfig.ts +++ b/packages/repack/src/commands/common/config/makeCompilerConfig.ts @@ -68,9 +68,7 @@ export async function makeCompilerConfig( // normalize the configs const normalizedConfigs = configs.map((config, index) => normalizeConfig(config, { - bundler: options.bundler, platform: options.platforms[index], - rootDir, }) ); diff --git a/packages/repack/src/commands/common/config/normalizeConfig.ts b/packages/repack/src/commands/common/config/normalizeConfig.ts index 4e91a2d87..c651ad4c2 100644 --- a/packages/repack/src/commands/common/config/normalizeConfig.ts +++ b/packages/repack/src/commands/common/config/normalizeConfig.ts @@ -1,6 +1,5 @@ import { customizeArray, mergeWithCustomize } from 'webpack-merge'; import type { ConfigurationObject } from '../../types.js'; -import { normalizeModuleRules } from '../normalizeModuleRules.js'; function normalizeDevServerHost(host?: string): string | undefined { switch (host) { @@ -52,13 +51,9 @@ function normalizeResolveExtensions( export function normalizeConfig( config: C, - options: { - bundler: 'rspack' | 'webpack'; - platform: string; - rootDir: string; - } + options: { platform: string } ): C { - const { bundler, platform, rootDir } = options; + const { platform } = options; const normalizedConfig = {} as C; @@ -109,16 +104,6 @@ export function normalizeConfig( }; } - /* normalize module rules by expanding repack-loader configuration */ - normalizedConfig.module = { - ...normalizedConfig.module, - rules: normalizeModuleRules(config.module.rules, { - bundler, - projectRoot: rootDir, - platform, - }), - }; - /* return the normalized config object */ return mergeWithCustomize({ customizeArray: customizeArray({ diff --git a/packages/repack/src/commands/common/normalizeModuleRules.ts b/packages/repack/src/commands/common/normalizeModuleRules.ts deleted file mode 100644 index 9300bb47a..000000000 --- a/packages/repack/src/commands/common/normalizeModuleRules.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { - // type PluginItem, - type TransformOptions, - loadOptions, -} from '@babel/core'; -import type { RuleSetRules } from '@rspack/core'; -import { - generateLoaderChain, - getSupportedSwcTransforms, -} from '../../utils/internal/index.js'; - -export interface NormalizeModuleRulesOptions { - bundler: 'rspack' | 'webpack'; - projectRoot: string; - platform: string; -} - -interface BabelProjectConfig extends TransformOptions { - plugins?: { - key: string; - manipulateOptions: (() => void) | undefined; - post: (() => void) | undefined; - pre: (() => void) | undefined; - visitor: unknown; - parserOverride: unknown; - generatorOverride: undefined; - options: Record; - externalDependencies: unknown[]; - }[]; -} - -function getProjectBabelConfig(projectRoot: string): BabelProjectConfig { - const babelConfig = loadOptions({ - cwd: projectRoot, - root: projectRoot, - }); - return babelConfig ?? {}; -} - -function configureLoadersForRule(options: NormalizeModuleRulesOptions) { - try { - const babelConfig = getProjectBabelConfig(options.projectRoot); - - const supportedSwcTransforms = getSupportedSwcTransforms( - babelConfig.plugins?.map((p) => p.key) ?? [] - ); - - // Generate loader chain for the rule.use field - const loaderChain = generateLoaderChain({ - projectRoot: options.projectRoot, - swcRules: supportedSwcTransforms, - originalBabelConfig: babelConfig, - }); - - return loaderChain; - } catch (error) { - // TODO why would we fail? - console.warn( - 'Failed to normalize repack-loader, falling back to babel-loader:', - error - ); - - // Fallback to just babel-loader - return [ - { - loader: '@callstack/repack/babel-loader', - parallel: true, - options: { projectRoot: options.projectRoot }, - }, - ]; - } -} - -export function normalizeModuleRules( - rules: RuleSetRules | undefined, - options: NormalizeModuleRulesOptions -): RuleSetRules { - if (!rules) { - return []; - } - - // skip swc for webpack for now - if (options.bundler === 'webpack') { - return rules; - } - - const normalizedRules: RuleSetRules = [...rules]; - for (const rule of normalizedRules) { - if (!rule || typeof rule !== 'object') { - continue; - } - - if ('use' in rule && rule.use !== undefined) { - if (typeof rule.use === 'string' && rule.use === 'repack-loader') { - rule.use = undefined; - rule.rules = configureLoadersForRule(options); - } else if ( - typeof rule.use === 'object' && - 'loader' in rule.use && - rule.use.loader === 'repack-loader' - ) { - rule.use = undefined; - rule.rules = configureLoadersForRule(options); - } - // other cases unhandled for now - } - - // if ('loader' in rule && rule.loader === 'repack-loader') { - } - - return normalizedRules; -} diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 9de5b6d7e..03c2fcd15 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -26,6 +26,7 @@ function isTSXSource(fileName: string) { interface CustomOptions { enableBabelRCLookup?: boolean; extendsBabelConfigPath?: string; + includePlugins?: Array]>; excludePlugins?: string[]; projectRoot: string; } @@ -99,23 +100,16 @@ function buildBabelConfig( plugins: [], }; - if (isTypeScriptSource(filename)) { - extraConfig.plugins!.push([ - '@babel/plugin-syntax-typescript', - { isTSX: false, allowNamespaces: true }, - ]); + if (options.includePlugins) { + extraConfig.plugins!.push(...options.includePlugins); } - if (isTSXSource(filename)) { - extraConfig.plugins!.push([ - '@babel/plugin-syntax-typescript', - { isTSX: true, allowNamespaces: true }, - ]); + const babelConfig = loadOptions(extraConfig); + if (!babelConfig) { + throw new Error('Failed to load babel config'); } - const babelConfig = loadOptions(extraConfig) as any; - - if (options.excludePlugins) { + if (options.excludePlugins && babelConfig.plugins) { babelConfig.plugins = babelConfig.plugins.filter( (plugin: { key: string }) => { return !options.excludePlugins!.includes(plugin.key); @@ -123,14 +117,10 @@ function buildBabelConfig( ); } - // babelConfig.plugins.forEach((plugin: any) => { - // console.log(plugin.key); - // }); - return babelConfig; } -const transform = ({ +export const transform = ({ filename, options, src, diff --git a/packages/repack/src/loaders/babelLoader/index.ts b/packages/repack/src/loaders/babelLoader/index.ts index 8fd14636d..1940d5a3b 100644 --- a/packages/repack/src/loaders/babelLoader/index.ts +++ b/packages/repack/src/loaders/babelLoader/index.ts @@ -1,4 +1,4 @@ -import babelLoader, { raw } from './babelLoader.js'; +import babelLoader, { transform, raw } from './babelLoader.js'; -export { raw }; +export { transform, raw }; export default babelLoader; diff --git a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts new file mode 100644 index 000000000..ff730937e --- /dev/null +++ b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts @@ -0,0 +1,90 @@ +import type { LoaderContext, SwcLoaderOptions } from '@rspack/core'; +import { + getSupportedSwcConfigurableTransforms, + getSupportedSwcCustomTransforms, + getSupportedSwcNormalTransforms, +} from '../../utils/internal/index.js'; +import { transform } from '../babelLoader/index.js'; +import { type HybridJsLoaderOptions, getOptions } from './options.js'; +import { + getProjectBabelConfig, + isTSXSource, + isTypeScriptSource, +} from './utilts.js'; + +type BabelTransform = [string, Record | undefined]; + +export const raw = false; + +export default function hybridJsLoader( + this: LoaderContext, + source: string +) { + this.cacheable(); + const callback = this.async(); + const options = getOptions(this); + const { swc } = this._compiler.rspack.experiments; + + const filename = this.resourcePath; + const includeBabelPlugins: Array]> = []; + + // add TS syntax plugins since RN preset only uses transform-typescript plugin + // which includes the syntax plugin under the hood + if (isTypeScriptSource(this.resourcePath)) { + includeBabelPlugins.push([ + '@babel/plugin-syntax-typescript', + { isTSX: false, allowNamespaces: true }, + ]); + } else if (isTSXSource(filename)) { + includeBabelPlugins.push([ + '@babel/plugin-syntax-typescript', + { isTSX: true, allowNamespaces: true }, + ]); + } + + const babelConfig = getProjectBabelConfig(options.projectRoot); + const babelTransforms = + babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? []; + + let normalTransforms: string[] = []; + let configurableTransforms: string[] = []; + let customTransforms: string[] = []; + let swcConfig: SwcLoaderOptions = { + env: { targets: { node: 24 } }, + jsc: { + parser: { syntax: 'ecmascript' }, + transform: { react: { useBuiltins: true } }, + }, + }; + + normalTransforms = getSupportedSwcNormalTransforms(babelTransforms); + ({ swcConfig, transformNames: configurableTransforms } = + getSupportedSwcConfigurableTransforms(babelTransforms, swcConfig)); + ({ swcConfig, transformNames: customTransforms } = + getSupportedSwcCustomTransforms(babelTransforms, swcConfig)); + + const excludeBabelPlugins: string[] = [ + ...normalTransforms, + ...configurableTransforms, + ...customTransforms, + ]; + + const babelResult = transform({ + filename: this.resourcePath, + src: source, + options: { + enableBabelRCLookup: true, + excludePlugins: excludeBabelPlugins, + includePlugins: includeBabelPlugins, + projectRoot: options.projectRoot, + }, + }); + + const swcResult = swc.transformSync(babelResult?.code!, { + // @ts-expect-error bad typing in rspack/swc + inputSourceMap: babelResult?.map, + ...swcConfig, + }); + + callback(null, swcResult?.code, swcResult?.map); +} diff --git a/packages/repack/src/loaders/hybridJsLoader/index.ts b/packages/repack/src/loaders/hybridJsLoader/index.ts new file mode 100644 index 000000000..17482a37f --- /dev/null +++ b/packages/repack/src/loaders/hybridJsLoader/index.ts @@ -0,0 +1,4 @@ +import hybridJsLoader, { raw } from './hybridJsLoader.js'; + +export { raw }; +export default hybridJsLoader; diff --git a/packages/repack/src/loaders/hybridJsLoader/options.ts b/packages/repack/src/loaders/hybridJsLoader/options.ts new file mode 100644 index 000000000..852641b29 --- /dev/null +++ b/packages/repack/src/loaders/hybridJsLoader/options.ts @@ -0,0 +1,38 @@ +import type { LoaderContext } from '@rspack/core'; +import { validate } from 'schema-utils'; + +export interface HybridJsLoaderOptions { + lazyImports: boolean | string[]; + projectRoot: string; +} + +type Schema = Parameters[0]; + +export const optionsSchema: Schema = { + type: 'object', + required: [], + properties: { + lazyImports: { + oneOf: [ + { type: 'boolean' }, + { + type: 'array', + items: { type: 'string' }, + }, + ], + }, + projectRoot: { + type: 'string', + }, + }, +}; + +export function getOptions( + loaderContext: LoaderContext +): HybridJsLoaderOptions { + const options = loaderContext.getOptions(loaderContext) || {}; + + validate(optionsSchema, options, { name: 'repackJsLoader' }); + + return options; +} diff --git a/packages/repack/src/loaders/hybridJsLoader/utilts.ts b/packages/repack/src/loaders/hybridJsLoader/utilts.ts new file mode 100644 index 000000000..1c5541c8f --- /dev/null +++ b/packages/repack/src/loaders/hybridJsLoader/utilts.ts @@ -0,0 +1,17 @@ +import { loadOptions } from '@babel/core'; + +export function isTypeScriptSource(fileName: string) { + return !!fileName && fileName.endsWith('.ts'); +} + +export function isTSXSource(fileName: string) { + return !!fileName && fileName.endsWith('.tsx'); +} + +export function getProjectBabelConfig(projectRoot: string) { + const babelConfig = loadOptions({ + cwd: projectRoot, + root: projectRoot, + }); + return babelConfig ?? {}; +} diff --git a/packages/repack/src/types/babel-core.d.ts b/packages/repack/src/types/babel-core.d.ts new file mode 100644 index 000000000..7d1b902f6 --- /dev/null +++ b/packages/repack/src/types/babel-core.d.ts @@ -0,0 +1,21 @@ +import type { TransformOptions } from '@babel/core'; + +declare module '@babel/core' { + interface BabelProjectConfig extends TransformOptions { + plugins?: { + key: string; + manipulateOptions: (() => void) | undefined; + post: (() => void) | undefined; + pre: (() => void) | undefined; + visitor: unknown; + parserOverride: unknown; + generatorOverride: undefined; + options?: Record; + externalDependencies: unknown[]; + }[]; + } + + export function loadOptions( + options: TransformOptions + ): BabelProjectConfig | null; +} diff --git a/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts b/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts deleted file mode 100644 index ec7802df3..000000000 --- a/packages/repack/src/utils/internal/getSupportedSwcTransforms.ts +++ /dev/null @@ -1,40 +0,0 @@ -const SWC_SUPPORTED_RULES = new Set([ - 'transform-block-scoping', - 'transform-classes', - 'transform-class-static-block', - // 'transform-class-properties', // TODO: currently bugged in swc - 'transform-private-property-in-object', - // 'transform-private-methods', // TODO: currently bugged in swc - 'transform-destructuring', - 'transform-async-to-generator', - 'transform-async-generator-functions', - 'transform-unicode-regex', - 'transform-named-capturing-groups-regex', - 'transform-optional-chaining', - 'transform-spread', - 'transform-object-rest-spread', - 'transform-parameters', - 'transform-function-name', - 'transform-nullish-coalescing-operator', - 'transform-logical-assignment-operators', - 'transform-sticky-regex', - 'transform-literals', - 'transform-optional-catch-binding', - 'transform-arrow-functions', - 'transform-numeric-separator', - 'transform-shorthand-properties', - 'transform-computed-properties', -]); - -function isSupportedTransform(transform: string): boolean { - return SWC_SUPPORTED_RULES.has(transform); -} - -function getSwcRuleName(babelTransformName: string): string { - // all swc rules are named the same as the babel transforms - return babelTransformName; -} - -export function getSupportedSwcTransforms(transforms: string[]) { - return transforms.filter(isSupportedTransform).map(getSwcRuleName); -} diff --git a/packages/repack/src/utils/internal/index.ts b/packages/repack/src/utils/internal/index.ts index 49e687260..96a4cec64 100644 --- a/packages/repack/src/utils/internal/index.ts +++ b/packages/repack/src/utils/internal/index.ts @@ -1,2 +1 @@ -export * from './getSupportedSwcTransforms.js'; -export * from './loaderChainGenerator.js'; +export * from './swc.js'; diff --git a/packages/repack/src/utils/internal/loaderChainGenerator.ts b/packages/repack/src/utils/internal/loaderChainGenerator.ts deleted file mode 100644 index 1339911bf..000000000 --- a/packages/repack/src/utils/internal/loaderChainGenerator.ts +++ /dev/null @@ -1,102 +0,0 @@ -import type { TransformOptions } from '@babel/core'; -import { getJsTransformRules } from '../getJsTransformRules.js'; - -export interface LoaderEntry { - loader: string; - parallel?: boolean; - options?: any; -} - -export interface GenerateLoaderChainOptions { - projectRoot: string; - swcRules: string[]; - originalBabelConfig: TransformOptions; -} - -function getSwcEnvironmentPreset(transforms: string[]) { - return { - // disable all transforms (node supports everything) - targets: { node: 24 }, - // add transforms manually that match the RN preset - include: transforms, - }; -} - -export function generateLoaderChain({ - projectRoot, - swcRules, -}: GenerateLoaderChainOptions): LoaderEntry[] { - const loaders: LoaderEntry[] = []; - - const swcEnvPreset = getSwcEnvironmentPreset(swcRules); - // Only add SWC loader if there are compatible plugins - if (swcRules.length > 0) { - const swcLoaderRules = getJsTransformRules({ - codegen: { enabled: false }, - flow: { enabled: false }, - }).map((rule) => { - const newRule = { ...rule }; - if ('oneOf' in rule && 'oneOf' in newRule) { - // @ts-ignore - newRule.test = undefined; - newRule.oneOf = rule.oneOf.map((oneOfRule) => { - if (oneOfRule.use.loader !== 'builtin:swc-loader') { - return oneOfRule; - } - const options = oneOfRule.use.options; - oneOfRule.use.options = { - ...options, - // @ts-ignore - env: { ...swcEnvPreset, forceAllTransforms: false }, - jsc: { - ...options.jsc, - assumptions: { - // nullish-coalescing-operator && optional-chaining loose mode - noDocumentAll: true, - // transform-class-properties loose mode - setPublicClassFields: true, - // object-rest-spread loose mode - setSpreadProperties: true, - // transform-private-methods loose mode - privateFieldsAsProperties: true, - }, - }, - }; - return oneOfRule; - }); - } - return newRule; - }); - // @ts-ignore this is just one swc rule with oneOf field - loaders.push(...swcLoaderRules); - } - - const excludePlugins = [ - ...swcRules, - // handled by swc jsc.externalHelpers - 'transform-runtime', - // handled by swc jsc.transform.react.development - 'transform-react-jsx-self', - 'transform-react-jsx-source', - // handled by swc module.type - 'transform-modules-commonjs', - // handled by swc jsc.transform.react.runtime - 'transform-react-jsx', - // handled by swc jsc.parser.exportDefaultFrom - 'proposal-export-default-from', - // handled by swc - 'transform-typescript', - ]; - - loaders.push({ - // @ts-ignore - type: 'javascript/auto', - use: { - loader: '@callstack/repack/babel-loader', - parallel: true, - options: { excludePlugins, projectRoot }, - }, - }); - - return loaders; -} diff --git a/packages/repack/src/utils/internal/swc.ts b/packages/repack/src/utils/internal/swc.ts new file mode 100644 index 000000000..0adaf7c4d --- /dev/null +++ b/packages/repack/src/utils/internal/swc.ts @@ -0,0 +1,326 @@ +import type { + SwcLoaderEsParserConfig, + SwcLoaderOptions, + SwcLoaderParserConfig, + SwcLoaderTsParserConfig, +} from '@rspack/core'; + +const SWC_SUPPORTED_NORMAL_RULES = new Set([ + 'transform-block-scoping', + 'transform-classes', + 'transform-class-static-block', + 'transform-destructuring', + 'transform-async-to-generator', + 'transform-async-generator-functions', + 'transform-unicode-regex', + 'transform-named-capturing-groups-regex', + 'transform-spread', + 'transform-parameters', + 'transform-function-name', + 'transform-logical-assignment-operators', + 'transform-sticky-regex', + 'transform-literals', + 'transform-optional-catch-binding', + 'transform-arrow-functions', + 'transform-numeric-separator', + 'transform-shorthand-properties', + 'transform-computed-properties', +]); + +const SWC_SUPPORTED_CONFIGURABLE_RULES = new Set([ + 'transform-class-properties', + 'transform-private-methods', + 'transform-private-property-in-object', + 'transform-object-rest-spread', + 'transform-optional-chaining', + 'transform-nullish-coalescing-operator', + 'transform-for-of', +]); + +const SWC_SUPPORTED_CUSTOM_RULES = new Set([ + 'transform-runtime', + 'transform-react-jsx-self', + 'transform-react-jsx-source', + 'transform-react-jsx', + 'transform-modules-commonjs', + 'proposal-export-default-from', + 'transform-typescript', +]); + +function getTransformRuntimeConfig( + swcConfig: SwcLoaderOptions +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + externalHelpers: true, + }, + }; +} + +function getTransformReactDevelopmentConfig( + swcConfig: SwcLoaderOptions +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + transform: { + ...swcConfig.jsc?.transform, + react: { + ...swcConfig.jsc?.transform?.react, + development: true, + }, + }, + }, + }; +} + +function getTransformReactRuntimeConfig( + swcConfig: SwcLoaderOptions, + reactRuntimeConfig: Record = { + runtime: 'automatic', + } +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + transform: { + ...swcConfig.jsc?.transform, + react: { + ...swcConfig.jsc?.transform?.react, + runtime: reactRuntimeConfig.runtime, + importSource: reactRuntimeConfig.importSource, + }, + }, + }, + }; +} + +function getTransformModulesCommonjsConfig( + swcConfig: SwcLoaderOptions, + moduleConfig: Record = { + strict: true, + strictMode: true, + allowTopLevelThis: true, + } +): SwcLoaderOptions { + return { + ...swcConfig, + module: { + ...swcConfig.module, + type: 'commonjs', + strict: Boolean(moduleConfig.strict), + strictMode: Boolean(moduleConfig.strictMode), + allowTopLevelThis: Boolean(moduleConfig.allowTopLevelThis), + }, + }; +} + +function getTransformExportDefaultFromConfig( + swcConfig: SwcLoaderOptions +): SwcLoaderOptions { + const parserConfig = ensureValidESParserConfig(swcConfig.jsc?.parser); + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + parser: { + ...parserConfig, + exportDefaultFrom: true, + }, + }, + }; +} + +function getTransformTypescriptConfig( + swcConfig: SwcLoaderOptions, + ruleConfig: Record = { isTSX: false } +): SwcLoaderOptions { + const parserConfig = ensureValidTSParserConfig(swcConfig.jsc?.parser); + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + parser: { + ...parserConfig, + syntax: 'typescript', + tsx: ruleConfig.isTSX, + }, + }, + }; +} + +function getTransformClassPropertiesConfig( + swcConfig: SwcLoaderOptions, + ruleConfig: Record = { loose: false } +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + assumptions: { + ...swcConfig.jsc?.assumptions, + setPublicClassFields: + swcConfig.jsc?.assumptions?.setPublicClassFields || ruleConfig.loose, + }, + }, + }; +} + +function getTransformPrivateMethodsPropertyConfig( + swcConfig: SwcLoaderOptions, + ruleConfig: Record = { loose: false } +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + assumptions: { + ...swcConfig.jsc?.assumptions, + privateFieldsAsProperties: + swcConfig.jsc?.assumptions?.privateFieldsAsProperties || + ruleConfig.loose, + setPublicClassFields: + swcConfig.jsc?.assumptions?.setPublicClassFields || ruleConfig.loose, + }, + }, + }; +} + +function getTransformObjectRestSpreadConfig( + swcConfig: SwcLoaderOptions, + ruleConfig: Record = { loose: false } +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + assumptions: { + ...swcConfig.jsc?.assumptions, + setSpreadProperties: + swcConfig.jsc?.assumptions?.setSpreadProperties || ruleConfig.loose, + }, + }, + }; +} + +function getTransformOptionalChainingNullishCoalescingConfig( + swcConfig: SwcLoaderOptions, + ruleConfig: Record = { loose: false } +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + assumptions: { + ...swcConfig.jsc?.assumptions, + noDocumentAll: + swcConfig.jsc?.assumptions?.noDocumentAll || ruleConfig.loose, + }, + }, + }; +} + +function getTransformForOfConfig( + swcConfig: SwcLoaderOptions, + ruleConfig: Record = { loose: false } +): SwcLoaderOptions { + return { + ...swcConfig, + jsc: { + ...swcConfig.jsc, + assumptions: { + ...swcConfig.jsc?.assumptions, + skipForOfIteratorClosing: + swcConfig.jsc?.assumptions?.skipForOfIteratorClosing || + ruleConfig.loose, + }, + }, + }; +} + +const SWC_SUPPORTED_CONFIGURABLE_RULES_MAP = { + 'transform-class-properties': getTransformClassPropertiesConfig, + 'transform-private-methods': getTransformPrivateMethodsPropertyConfig, + 'transform-private-property-in-object': + getTransformPrivateMethodsPropertyConfig, + 'transform-object-rest-spread': getTransformObjectRestSpreadConfig, + 'transform-optional-chaining': + getTransformOptionalChainingNullishCoalescingConfig, + 'transform-nullish-coalescing-operator': + getTransformOptionalChainingNullishCoalescingConfig, + 'transform-for-of': getTransformForOfConfig, +}; + +const SWC_SUPPORTED_CUSTOM_RULES_MAP = { + 'transform-runtime': getTransformRuntimeConfig, + 'transform-react-jsx': getTransformReactRuntimeConfig, + 'transform-react-jsx-self': getTransformReactDevelopmentConfig, + 'transform-react-jsx-source': getTransformReactDevelopmentConfig, + 'transform-modules-commonjs': getTransformModulesCommonjsConfig, + 'proposal-export-default-from': getTransformExportDefaultFromConfig, + 'transform-typescript': getTransformTypescriptConfig, +}; + +function ensureValidTSParserConfig( + parserConfig?: SwcLoaderParserConfig +): SwcLoaderTsParserConfig { + if (parserConfig?.syntax !== 'typescript') { + return { syntax: 'typescript' }; + } + return parserConfig; +} + +function ensureValidESParserConfig( + parserConfig?: SwcLoaderParserConfig +): SwcLoaderEsParserConfig { + if (parserConfig?.syntax !== 'ecmascript') { + return { syntax: 'ecmascript' }; + } + return parserConfig; +} + +export function getSupportedSwcNormalTransforms( + transforms: [string, Record | undefined][] +) { + return transforms + .filter(([transform]) => SWC_SUPPORTED_NORMAL_RULES.has(transform)) + .map(([transform]) => transform); +} + +export function getSupportedSwcConfigurableTransforms( + transforms: [string, Record | undefined][], + swcConfig: SwcLoaderOptions +) { + const transformNames = transforms.map(([transform]) => transform); + const finalSwcConfig = transforms + .filter(([transform]) => SWC_SUPPORTED_CONFIGURABLE_RULES.has(transform)) + .reduce((config, [transform, transformConfig]) => { + const handler = + SWC_SUPPORTED_CONFIGURABLE_RULES_MAP[ + transform as keyof typeof SWC_SUPPORTED_CONFIGURABLE_RULES_MAP + ]; + return handler(config, transformConfig); + }, swcConfig); + return { swcConfig: finalSwcConfig, transformNames }; +} + +export function getSupportedSwcCustomTransforms( + transforms: [string, Record | undefined][], + swcConfig: SwcLoaderOptions +) { + const transformNames = transforms.map(([transform]) => transform); + const finalSwcConfig = transforms + .filter(([transform]) => SWC_SUPPORTED_CUSTOM_RULES.has(transform)) + .reduce((config, [transform, transformConfig]) => { + const handler = + SWC_SUPPORTED_CUSTOM_RULES_MAP[ + transform as keyof typeof SWC_SUPPORTED_CUSTOM_RULES_MAP + ]; + return handler(config, transformConfig); + }, swcConfig); + return { swcConfig: finalSwcConfig, transformNames }; +} From 2514a340b3f6261cbcf4bd05e64b2aea9c429578 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 1 Aug 2025 19:08:09 +0200 Subject: [PATCH 16/61] feat: working rspack --- apps/tester-app/rspack.config.mjs | 6 +- .../configs/rspack.host-app.mts | 6 +- .../src/loaders/babelLoader/babelLoader.ts | 3 + .../loaders/hybridJsLoader/hybridJsLoader.ts | 62 ++++++++++++++---- .../src/loaders/hybridJsLoader/options.ts | 49 +++++--------- .../src/loaders/hybridJsLoader/utilts.ts | 4 ++ packages/repack/src/utils/internal/swc.ts | 64 ++++--------------- 7 files changed, 99 insertions(+), 95 deletions(-) diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index ee0178448..1d5bff9eb 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -33,7 +33,11 @@ export default Repack.defineRspackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: 'repack-loader', + use: { + loader: '@callstack/repack/hybrid-js-loader', + parallel: true, + options: {}, + }, type: 'javascript/auto', }, { diff --git a/apps/tester-federation-v2/configs/rspack.host-app.mts b/apps/tester-federation-v2/configs/rspack.host-app.mts index e9fb2fa89..2c60702d9 100644 --- a/apps/tester-federation-v2/configs/rspack.host-app.mts +++ b/apps/tester-federation-v2/configs/rspack.host-app.mts @@ -22,7 +22,11 @@ export default Repack.defineRspackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: 'repack-loader', + use: { + loader: '@callstack/repack/hybrid-js-loader', + parallel: true, + options: { projectRoot: context }, + }, type: 'javascript/auto', }, ...Repack.getAssetTransformRules(), diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 03c2fcd15..183f394f0 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -29,6 +29,7 @@ interface CustomOptions { includePlugins?: Array]>; excludePlugins?: string[]; projectRoot: string; + sourceMaps?: boolean; } /** * Return a memoized function that checks for the existence of a @@ -132,6 +133,7 @@ export const transform = ({ const builtConfig = buildBabelConfig(filename, options); const babelConfig: TransformOptions = { sourceType: 'unambiguous', + sourceMaps: options.sourceMaps, ...builtConfig, caller: { name: 'repack' }, ast: false, @@ -169,6 +171,7 @@ export default function babelLoader( // this is currently broken in Rspack and needs to be fixed upstream // for now we can pass this as an option to loader projectRoot: options.projectRoot, + sourceMaps: this.sourceMap, }, }); // @ts-ignore diff --git a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts index ff730937e..23ec95324 100644 --- a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts +++ b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts @@ -1,11 +1,16 @@ -import type { LoaderContext, SwcLoaderOptions } from '@rspack/core'; +import { rspack } from '@rspack/core'; +import type { + LoaderContext, + SwcLoaderOptions, + SwcLoaderParserConfig, +} from '@rspack/core'; import { getSupportedSwcConfigurableTransforms, getSupportedSwcCustomTransforms, getSupportedSwcNormalTransforms, } from '../../utils/internal/index.js'; import { transform } from '../babelLoader/index.js'; -import { type HybridJsLoaderOptions, getOptions } from './options.js'; +import type { HybridJsLoaderOptions } from './options.js'; import { getProjectBabelConfig, isTSXSource, @@ -14,6 +19,8 @@ import { type BabelTransform = [string, Record | undefined]; +const swc = rspack.experiments.swc; + export const raw = false; export default function hybridJsLoader( @@ -22,37 +29,44 @@ export default function hybridJsLoader( ) { this.cacheable(); const callback = this.async(); - const options = getOptions(this); - const { swc } = this._compiler.rspack.experiments; + const options = this.getOptions(); const filename = this.resourcePath; + const projectRoot = options.projectRoot; + const lazyImports = options.lazyImports ?? true; + const includeBabelPlugins: Array]> = []; + let parserConfig: SwcLoaderParserConfig; // add TS syntax plugins since RN preset only uses transform-typescript plugin // which includes the syntax plugin under the hood if (isTypeScriptSource(this.resourcePath)) { + parserConfig = { syntax: 'typescript', tsx: false }; includeBabelPlugins.push([ '@babel/plugin-syntax-typescript', { isTSX: false, allowNamespaces: true }, ]); } else if (isTSXSource(filename)) { + parserConfig = { syntax: 'typescript', tsx: true }; includeBabelPlugins.push([ '@babel/plugin-syntax-typescript', { isTSX: true, allowNamespaces: true }, ]); + } else { + parserConfig = { syntax: 'ecmascript', jsx: true }; } - const babelConfig = getProjectBabelConfig(options.projectRoot); + const babelConfig = getProjectBabelConfig(projectRoot); const babelTransforms = babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? []; let normalTransforms: string[] = []; let configurableTransforms: string[] = []; let customTransforms: string[] = []; + let swcConfig: SwcLoaderOptions = { - env: { targets: { node: 24 } }, jsc: { - parser: { syntax: 'ecmascript' }, + parser: parserConfig, transform: { react: { useBuiltins: true } }, }, }; @@ -76,14 +90,40 @@ export default function hybridJsLoader( enableBabelRCLookup: true, excludePlugins: excludeBabelPlugins, includePlugins: includeBabelPlugins, - projectRoot: options.projectRoot, + projectRoot: projectRoot, + sourceMaps: this.sourceMap, }, }); - const swcResult = swc.transformSync(babelResult?.code!, { - // @ts-expect-error bad typing in rspack/swc - inputSourceMap: babelResult?.map, + const finalSwcConfig: SwcLoaderOptions = { ...swcConfig, + // set env based on babel transforms + env: { + targets: { node: 24 }, + include: [...normalTransforms, ...configurableTransforms], + }, + // set lazy imports based on loader options + module: { + ...swcConfig.module, + lazy: lazyImports, + type: swcConfig.module!.type, + }, + }; + + const swcResult = swc.transformSync(babelResult?.code!, { + ...finalSwcConfig, + filename: this.resourcePath, + root: projectRoot, + sourceMaps: this.sourceMap, + // TODO potentially optimize with fast-stringify + inputSourceMap: JSON.stringify(babelResult?.map), + // TODO is this needed? + sourceRoot: babelResult?.map?.sourceRoot, + sourceFileName: babelResult?.map?.file, + minify: false, + configFile: false, + swcrc: false, + caller: { name: 'repack-hybrid-js-loader' }, }); callback(null, swcResult?.code, swcResult?.map); diff --git a/packages/repack/src/loaders/hybridJsLoader/options.ts b/packages/repack/src/loaders/hybridJsLoader/options.ts index 852641b29..a84613adc 100644 --- a/packages/repack/src/loaders/hybridJsLoader/options.ts +++ b/packages/repack/src/loaders/hybridJsLoader/options.ts @@ -1,38 +1,23 @@ -import type { LoaderContext } from '@rspack/core'; -import { validate } from 'schema-utils'; - export interface HybridJsLoaderOptions { - lazyImports: boolean | string[]; + lazyImports?: boolean | string[]; projectRoot: string; } -type Schema = Parameters[0]; - -export const optionsSchema: Schema = { - type: 'object', - required: [], - properties: { - lazyImports: { - oneOf: [ - { type: 'boolean' }, - { - type: 'array', - items: { type: 'string' }, - }, - ], - }, - projectRoot: { - type: 'string', - }, - }, -}; - -export function getOptions( - loaderContext: LoaderContext -): HybridJsLoaderOptions { - const options = loaderContext.getOptions(loaderContext) || {}; - - validate(optionsSchema, options, { name: 'repackJsLoader' }); +export function validateOptions(options: HybridJsLoaderOptions) { + if (!options.projectRoot || typeof options.projectRoot !== 'string') { + throw new Error( + 'Option `projectRoot` is required and must be of type string' + ); + } - return options; + if (options.lazyImports) { + if ( + typeof options.lazyImports !== 'boolean' && + !Array.isArray(options.lazyImports) + ) { + throw new Error( + 'Option `lazyImports` must be of type boolean or an array of strings' + ); + } + } } diff --git a/packages/repack/src/loaders/hybridJsLoader/utilts.ts b/packages/repack/src/loaders/hybridJsLoader/utilts.ts index 1c5541c8f..f5dc10044 100644 --- a/packages/repack/src/loaders/hybridJsLoader/utilts.ts +++ b/packages/repack/src/loaders/hybridJsLoader/utilts.ts @@ -8,6 +8,10 @@ export function isTSXSource(fileName: string) { return !!fileName && fileName.endsWith('.tsx'); } +export function isJSXSource(fileName: string) { + return !!fileName && fileName.endsWith('.jsx'); +} + export function getProjectBabelConfig(projectRoot: string) { const babelConfig = loadOptions({ cwd: projectRoot, diff --git a/packages/repack/src/utils/internal/swc.ts b/packages/repack/src/utils/internal/swc.ts index 0adaf7c4d..a1a4d7843 100644 --- a/packages/repack/src/utils/internal/swc.ts +++ b/packages/repack/src/utils/internal/swc.ts @@ -1,9 +1,4 @@ -import type { - SwcLoaderEsParserConfig, - SwcLoaderOptions, - SwcLoaderParserConfig, - SwcLoaderTsParserConfig, -} from '@rspack/core'; +import type { SwcLoaderOptions } from '@rspack/core'; const SWC_SUPPORTED_NORMAL_RULES = new Set([ 'transform-block-scoping', @@ -28,8 +23,8 @@ const SWC_SUPPORTED_NORMAL_RULES = new Set([ ]); const SWC_SUPPORTED_CONFIGURABLE_RULES = new Set([ - 'transform-class-properties', - 'transform-private-methods', + // 'transform-class-properties', + // 'transform-private-methods', 'transform-private-property-in-object', 'transform-object-rest-spread', 'transform-optional-chaining', @@ -44,7 +39,6 @@ const SWC_SUPPORTED_CUSTOM_RULES = new Set([ 'transform-react-jsx', 'transform-modules-commonjs', 'proposal-export-default-from', - 'transform-typescript', ]); function getTransformRuntimeConfig( @@ -122,37 +116,22 @@ function getTransformModulesCommonjsConfig( function getTransformExportDefaultFromConfig( swcConfig: SwcLoaderOptions ): SwcLoaderOptions { - const parserConfig = ensureValidESParserConfig(swcConfig.jsc?.parser); + if (swcConfig.jsc?.parser?.syntax === 'typescript') { + return swcConfig; + } return { ...swcConfig, jsc: { ...swcConfig.jsc, parser: { - ...parserConfig, + ...swcConfig.jsc?.parser, + syntax: 'ecmascript', exportDefaultFrom: true, }, }, }; } -function getTransformTypescriptConfig( - swcConfig: SwcLoaderOptions, - ruleConfig: Record = { isTSX: false } -): SwcLoaderOptions { - const parserConfig = ensureValidTSParserConfig(swcConfig.jsc?.parser); - return { - ...swcConfig, - jsc: { - ...swcConfig.jsc, - parser: { - ...parserConfig, - syntax: 'typescript', - tsx: ruleConfig.isTSX, - }, - }, - }; -} - function getTransformClassPropertiesConfig( swcConfig: SwcLoaderOptions, ruleConfig: Record = { loose: false } @@ -262,27 +241,8 @@ const SWC_SUPPORTED_CUSTOM_RULES_MAP = { 'transform-react-jsx-source': getTransformReactDevelopmentConfig, 'transform-modules-commonjs': getTransformModulesCommonjsConfig, 'proposal-export-default-from': getTransformExportDefaultFromConfig, - 'transform-typescript': getTransformTypescriptConfig, }; -function ensureValidTSParserConfig( - parserConfig?: SwcLoaderParserConfig -): SwcLoaderTsParserConfig { - if (parserConfig?.syntax !== 'typescript') { - return { syntax: 'typescript' }; - } - return parserConfig; -} - -function ensureValidESParserConfig( - parserConfig?: SwcLoaderParserConfig -): SwcLoaderEsParserConfig { - if (parserConfig?.syntax !== 'ecmascript') { - return { syntax: 'ecmascript' }; - } - return parserConfig; -} - export function getSupportedSwcNormalTransforms( transforms: [string, Record | undefined][] ) { @@ -295,7 +255,9 @@ export function getSupportedSwcConfigurableTransforms( transforms: [string, Record | undefined][], swcConfig: SwcLoaderOptions ) { - const transformNames = transforms.map(([transform]) => transform); + const transformNames = transforms + .filter(([transform]) => SWC_SUPPORTED_CONFIGURABLE_RULES.has(transform)) + .map(([transform]) => transform); const finalSwcConfig = transforms .filter(([transform]) => SWC_SUPPORTED_CONFIGURABLE_RULES.has(transform)) .reduce((config, [transform, transformConfig]) => { @@ -312,7 +274,9 @@ export function getSupportedSwcCustomTransforms( transforms: [string, Record | undefined][], swcConfig: SwcLoaderOptions ) { - const transformNames = transforms.map(([transform]) => transform); + const transformNames = transforms + .filter(([transform]) => SWC_SUPPORTED_CUSTOM_RULES.has(transform)) + .map(([transform]) => transform); const finalSwcConfig = transforms .filter(([transform]) => SWC_SUPPORTED_CUSTOM_RULES.has(transform)) .reduce((config, [transform, transformConfig]) => { From cf918416aa6d2f29ff999b997f4bb29c8f6a6d20 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 1 Aug 2025 19:15:08 +0200 Subject: [PATCH 17/61] chore: update mini app config --- apps/tester-federation-v2/configs/rspack.mini-app.mts | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/apps/tester-federation-v2/configs/rspack.mini-app.mts b/apps/tester-federation-v2/configs/rspack.mini-app.mts index f5ebba3bf..a541872b8 100644 --- a/apps/tester-federation-v2/configs/rspack.mini-app.mts +++ b/apps/tester-federation-v2/configs/rspack.mini-app.mts @@ -20,18 +20,12 @@ export default Repack.defineRspackConfig((env) => { }, module: { rules: [ - ...Repack.getJsTransformRules({ - flow: { enabled: false }, - codegen: { enabled: false }, - }), { test: /\.[cm]?[jt]sx?$/, use: { - loader: '@callstack/repack/babel-loader', + loader: '@callstack/repack/hybrid-js-loader', parallel: true, - options: { - projectRoot: context, - }, + options: { projectRoot: context }, }, type: 'javascript/auto', }, From 3775286716c633d42476cfe778a1ac979aa1a84a Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 13:37:36 +0200 Subject: [PATCH 18/61] chore: undo changes to getSwcLoaderOptions --- packages/repack/src/utils/getSwcLoaderOptions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/repack/src/utils/getSwcLoaderOptions.ts b/packages/repack/src/utils/getSwcLoaderOptions.ts index c8652c8d5..d337f8a31 100644 --- a/packages/repack/src/utils/getSwcLoaderOptions.ts +++ b/packages/repack/src/utils/getSwcLoaderOptions.ts @@ -28,7 +28,7 @@ function getEnvironmentPreset() { }; } -function getCompilerAssumptions(): Record { +function getCompilerAssumptions() { return { // Loose mode for: transform-class-properties setPublicClassFields: true, From 2d058fd462885246a25713d246c666053021a0e8 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 13:39:02 +0200 Subject: [PATCH 19/61] chore: update comments --- .../repack/src/loaders/hybridJsLoader/hybridJsLoader.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts index 23ec95324..8f2dbf9e7 100644 --- a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts +++ b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts @@ -38,8 +38,9 @@ export default function hybridJsLoader( const includeBabelPlugins: Array]> = []; let parserConfig: SwcLoaderParserConfig; - // add TS syntax plugins since RN preset only uses transform-typescript plugin - // which includes the syntax plugin under the hood + // add TS syntax plugins since RN preset + // only uses transform-typescript plugin + // which includes the syntax-typescript plugin if (isTypeScriptSource(this.resourcePath)) { parserConfig = { syntax: 'typescript', tsx: false }; includeBabelPlugins.push([ @@ -53,6 +54,7 @@ export default function hybridJsLoader( { isTSX: true, allowNamespaces: true }, ]); } else { + // include JSX in .js files parserConfig = { syntax: 'ecmascript', jsx: true }; } From af598146792532ec1a6c3089b4e933aa78c13335 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 13:39:41 +0200 Subject: [PATCH 20/61] chore: revert changes in commands --- .../repack/src/commands/common/config/makeCompilerConfig.ts | 4 +--- packages/repack/src/commands/common/config/normalizeConfig.ts | 4 +--- packages/repack/src/commands/types.ts | 3 +-- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/repack/src/commands/common/config/makeCompilerConfig.ts b/packages/repack/src/commands/common/config/makeCompilerConfig.ts index fbbea57fd..1740ef02f 100644 --- a/packages/repack/src/commands/common/config/makeCompilerConfig.ts +++ b/packages/repack/src/commands/common/config/makeCompilerConfig.ts @@ -67,9 +67,7 @@ export async function makeCompilerConfig( // normalize the configs const normalizedConfigs = configs.map((config, index) => - normalizeConfig(config, { - platform: options.platforms[index], - }) + normalizeConfig(config, options.platforms[index]) ); const plugins = normalizedConfigs.flatMap((config) => diff --git a/packages/repack/src/commands/common/config/normalizeConfig.ts b/packages/repack/src/commands/common/config/normalizeConfig.ts index c651ad4c2..8e0029d7d 100644 --- a/packages/repack/src/commands/common/config/normalizeConfig.ts +++ b/packages/repack/src/commands/common/config/normalizeConfig.ts @@ -51,10 +51,8 @@ function normalizeResolveExtensions( export function normalizeConfig( config: C, - options: { platform: string } + platform: string ): C { - const { platform } = options; - const normalizedConfig = {} as C; /* normalize compiler name to be equal to platform */ diff --git a/packages/repack/src/commands/types.ts b/packages/repack/src/commands/types.ts index 58d6859a3..135ff3926 100644 --- a/packages/repack/src/commands/types.ts +++ b/packages/repack/src/commands/types.ts @@ -67,8 +67,7 @@ type ConfigKeys = | 'entry' | 'optimization' | 'output' - | 'resolve' - | 'module'; + | 'resolve'; export type ConfigurationObject = Partial>; From 9b0a65ec9e809be06666d339ee88bfc63fd02da5 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 19:08:36 +0200 Subject: [PATCH 21/61] refactor: make parts more reusable --- .../src/loaders/babelLoader/babelLoader.ts | 99 ++++--------------- .../repack/src/loaders/babelLoader/utils.ts | 56 +++++++++++ .../loaders/hybridJsLoader/hybridJsLoader.ts | 10 +- 3 files changed, 80 insertions(+), 85 deletions(-) create mode 100644 packages/repack/src/loaders/babelLoader/utils.ts diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 183f394f0..8d9ade95f 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -1,98 +1,34 @@ -import fs from 'node:fs'; -import path from 'node:path'; import { - type Node, + type ParseResult, type TransformOptions, loadOptions, parseSync, transformFromAstSync, } from '@babel/core'; -// @ts-ignore -import * as hermesParser from 'hermes-parser'; import type { LoaderContext } from '@rspack/core'; import { type BabelLoaderOptions, getOptions } from './options.js'; +import { isTSXSource, isTypeScriptSource, loadHermesParser } from './utils.js'; export const raw = false; -function isTypeScriptSource(fileName: string) { - return !!fileName && fileName.endsWith('.ts'); -} - -function isTSXSource(fileName: string) { - return !!fileName && fileName.endsWith('.tsx'); -} - -interface CustomOptions { - enableBabelRCLookup?: boolean; - extendsBabelConfigPath?: string; - includePlugins?: Array]>; - excludePlugins?: string[]; +interface CustomTransformOptions { + caller: { name: string }; projectRoot: string; sourceMaps?: boolean; + includePlugins?: Array]>; + excludePlugins?: string[]; } -/** - * Return a memoized function that checks for the existence of a - * project level .babelrc file, and if it doesn't exist, reads the - * default RN babelrc file and uses that. - */ -const _getBabelRC = (() => { - let babelRC: TransformOptions | null = null; - - return function _getBabelRC({ - projectRoot, - extendsBabelConfigPath, - }: CustomOptions) { - if (babelRC != null) { - return babelRC; - } - - babelRC = { - plugins: [], - extends: extendsBabelConfigPath, - }; - - if (extendsBabelConfigPath) { - return babelRC; - } - - // Let's look for a babel config file in the project root. - let projectBabelRCPath: string | undefined; - - // .babelrc - if (projectRoot) { - projectBabelRCPath = path.resolve(projectRoot, '.babelrc'); - } - - if (projectBabelRCPath) { - // .babelrc.js - if (!fs.existsSync(projectBabelRCPath)) { - projectBabelRCPath = path.resolve(projectRoot, '.babelrc.js'); - } - - // babel.config.js - if (!fs.existsSync(projectBabelRCPath)) { - projectBabelRCPath = path.resolve(projectRoot, 'babel.config.js'); - } - - // If we found a babel config file, extend our config off of it - if (fs.existsSync(projectBabelRCPath)) { - babelRC.extends = projectBabelRCPath; - } - } - - return babelRC; - }; -})(); function buildBabelConfig( filename: string, - options: CustomOptions + options: CustomTransformOptions ): TransformOptions { const extraConfig: TransformOptions = { - babelrc: options.enableBabelRCLookup ?? true, + babelrc: true, code: true, cwd: options.projectRoot, + root: options.projectRoot, filename, highlightCode: true, compact: false, @@ -121,26 +57,29 @@ function buildBabelConfig( return babelConfig; } -export const transform = ({ +export const transform = async ({ filename, options, src, }: { filename: string; - options: CustomOptions; + options: CustomTransformOptions; src: string; }) => { const builtConfig = buildBabelConfig(filename, options); const babelConfig: TransformOptions = { + caller: options.caller, sourceType: 'unambiguous', sourceMaps: options.sourceMaps, ...builtConfig, - caller: { name: 'repack' }, ast: false, cloneInputAst: false, }; - const sourceAst: Node = + // load hermes parser dynamically to match the version from preset + const hermesParser = await loadHermesParser(options.projectRoot); + + const sourceAst: ParseResult | null = isTypeScriptSource(filename) || isTSXSource(filename) ? parseSync(src, babelConfig) : hermesParser.parse(src, { @@ -150,10 +89,10 @@ export const transform = ({ sourceType: babelConfig.sourceType, }); - return transformFromAstSync(sourceAst, src, babelConfig); + return transformFromAstSync(sourceAst!, src, babelConfig); }; -export default function babelLoader( +export default async function babelLoader( this: LoaderContext, source: string ) { @@ -166,7 +105,7 @@ export default function babelLoader( filename: this.resourcePath, src: source, options: { - enableBabelRCLookup: true, + caller: { name: '@callstack/repack/babel-loader' }, excludePlugins: options.excludePlugins, // this is currently broken in Rspack and needs to be fixed upstream // for now we can pass this as an option to loader diff --git a/packages/repack/src/loaders/babelLoader/utils.ts b/packages/repack/src/loaders/babelLoader/utils.ts new file mode 100644 index 000000000..e7c83f11f --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/utils.ts @@ -0,0 +1,56 @@ +import type { ParseResult } from '@babel/core'; + +export interface HermesParser { + parse: ( + src: string, + opts: { + babel: boolean; + flow?: 'all' | 'detect'; + reactRuntimeTarget: string; + sourceType: 'script' | 'module' | 'unambiguous' | null | undefined; + } + ) => ParseResult; +} + +export function isTypeScriptSource(fileName: string) { + return !!fileName && fileName.endsWith('.ts'); +} + +export function isTSXSource(fileName: string) { + return !!fileName && fileName.endsWith('.tsx'); +} + +function resolveHermesParser(projectRoot: string) { + const reactNativeBabelPresetPath = require.resolve( + '@react-native/babel-preset', + { paths: [projectRoot] } + ); + + const babelPluginSyntaxHermesParserPath = require.resolve( + 'babel-plugin-syntax-hermes-parser', + { paths: [reactNativeBabelPresetPath] } + ); + + const hermesParserPath = require.resolve('hermes-parser', { + paths: [babelPluginSyntaxHermesParserPath], + }); + + return hermesParserPath; +} + +export async function loadHermesParser( + projectRoot: string +): Promise { + try { + const hermesParserPath = resolveHermesParser(projectRoot); + const hermesParser = await import(hermesParserPath); + return hermesParser; + } catch (e) { + console.error(e); + throw new Error( + `Failed to import 'hermes-parser'. Make sure you have '@react-native/babel-preset' installed in your project.` + ); + } +} + +loadHermesParser(process.cwd()); diff --git a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts index 8f2dbf9e7..594a2bafd 100644 --- a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts +++ b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts @@ -23,7 +23,7 @@ const swc = rspack.experiments.swc; export const raw = false; -export default function hybridJsLoader( +export default async function hybridJsLoader( this: LoaderContext, source: string ) { @@ -85,15 +85,15 @@ export default function hybridJsLoader( ...customTransforms, ]; - const babelResult = transform({ + const babelResult = await transform({ filename: this.resourcePath, src: source, options: { - enableBabelRCLookup: true, - excludePlugins: excludeBabelPlugins, - includePlugins: includeBabelPlugins, + caller: { name: '@callstack/repack/hybrid-js-loader' }, projectRoot: projectRoot, sourceMaps: this.sourceMap, + excludePlugins: excludeBabelPlugins, + includePlugins: includeBabelPlugins, }, }); From 9f58fdaaa466edc5b054aa301cc69f7ce4e679d1 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 19:34:05 +0200 Subject: [PATCH 22/61] chore: add TODOs for 6.0 --- packages/plugin-nativewind/src/plugin.ts | 2 ++ packages/plugin-reanimated/src/plugin.ts | 1 + 2 files changed, 3 insertions(+) diff --git a/packages/plugin-nativewind/src/plugin.ts b/packages/plugin-nativewind/src/plugin.ts index b8463e04c..dfa157c96 100644 --- a/packages/plugin-nativewind/src/plugin.ts +++ b/packages/plugin-nativewind/src/plugin.ts @@ -151,6 +151,8 @@ export class NativeWindPlugin { * Second, we need to configure the `builtin:swc-loader` to properly handle NativeWind's JSX transformations. * We look for any instances of the `builtin:swc-loader` in the Rspack configuration and modify their options * to include the NativeWind react import source. + * + * TODO made obsolete by the new hybrid loader, remove in 6.0 */ compiler.options.module.rules.forEach((rule) => { if (!rule || typeof rule !== 'object') { diff --git a/packages/plugin-reanimated/src/plugin.ts b/packages/plugin-reanimated/src/plugin.ts index eb087891b..36ef79b17 100644 --- a/packages/plugin-reanimated/src/plugin.ts +++ b/packages/plugin-reanimated/src/plugin.ts @@ -19,6 +19,7 @@ export class ReanimatedPlugin { const reanimatedVersion = this.getReanimatedVersion(reanimatedPath); // add rules for transpiling wih reanimated loader + // TODO made obsolete by the new hybrid loader, remove in 6.0 compiler.options.module.rules.push( reanimatedVersion.major < 4 ? reanimated3ModuleRules From e218ed475b051aae46ddf2a077ce0d6c93b32e22 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 20:49:01 +0200 Subject: [PATCH 23/61] refactor: babel loader accepts babel transform options --- .../src/loaders/babelLoader/babelLoader.ts | 91 ++++++++----------- .../repack/src/loaders/babelLoader/options.ts | 33 ------- .../repack/src/loaders/babelLoader/utils.ts | 6 +- 3 files changed, 40 insertions(+), 90 deletions(-) delete mode 100644 packages/repack/src/loaders/babelLoader/options.ts diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 8d9ade95f..512b70b65 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -1,5 +1,4 @@ import { - type ParseResult, type TransformOptions, loadOptions, parseSync, @@ -7,41 +6,41 @@ import { } from '@babel/core'; import type { LoaderContext } from '@rspack/core'; -import { type BabelLoaderOptions, getOptions } from './options.js'; import { isTSXSource, isTypeScriptSource, loadHermesParser } from './utils.js'; export const raw = false; -interface CustomTransformOptions { - caller: { name: string }; - projectRoot: string; - sourceMaps?: boolean; +interface BabelLoaderOptions extends TransformOptions {} + +interface CustomTransformOptions extends TransformOptions { includePlugins?: Array]>; excludePlugins?: string[]; } -function buildBabelConfig( - filename: string, - options: CustomTransformOptions -): TransformOptions { - const extraConfig: TransformOptions = { +function buildBabelConfig(options: CustomTransformOptions): TransformOptions { + const { includePlugins, excludePlugins, ...otherOptions } = options; + + const config: TransformOptions = { babelrc: true, - code: true, - cwd: options.projectRoot, - root: options.projectRoot, - filename, highlightCode: true, - compact: false, comments: true, - minified: false, plugins: [], + sourceType: 'unambiguous', + ...otherOptions, + // output settings + ast: false, + code: true, + cloneInputAst: false, + // disable optimization through babel + compact: false, + minified: false, }; if (options.includePlugins) { - extraConfig.plugins!.push(...options.includePlugins); + config.plugins!.push(...options.includePlugins); } - const babelConfig = loadOptions(extraConfig); + const babelConfig = loadOptions(config); if (!babelConfig) { throw new Error('Failed to load babel config'); } @@ -57,30 +56,18 @@ function buildBabelConfig( return babelConfig; } -export const transform = async ({ - filename, - options, - src, -}: { - filename: string; - options: CustomTransformOptions; - src: string; -}) => { - const builtConfig = buildBabelConfig(filename, options); - const babelConfig: TransformOptions = { - caller: options.caller, - sourceType: 'unambiguous', - sourceMaps: options.sourceMaps, - ...builtConfig, - ast: false, - cloneInputAst: false, - }; - +export const transform = async ( + src: string, + options: CustomTransformOptions +) => { + const babelConfig = buildBabelConfig(options); + const projectRoot = options.root ?? options.cwd; // load hermes parser dynamically to match the version from preset - const hermesParser = await loadHermesParser(options.projectRoot); + const hermesParser = await loadHermesParser(projectRoot); - const sourceAst: ParseResult | null = - isTypeScriptSource(filename) || isTSXSource(filename) + // filename will be always defined at this point + const sourceAst = + isTypeScriptSource(options.filename!) || isTSXSource(options.filename!) ? parseSync(src, babelConfig) : hermesParser.parse(src, { babel: true, @@ -89,7 +76,11 @@ export const transform = async ({ sourceType: babelConfig.sourceType, }); - return transformFromAstSync(sourceAst!, src, babelConfig); + if (!sourceAst) { + throw new Error(`Failed to parse source file: ${options.filename}`); + } + + return transformFromAstSync(sourceAst, src, babelConfig); }; export default async function babelLoader( @@ -98,20 +89,14 @@ export default async function babelLoader( ) { this.cacheable(); const callback = this.async(); - const options = getOptions(this); + const options = this.getOptions(); try { - const result = transform({ + const result = transform(source, { + sourceMaps: this.sourceMap, + ...options, + caller: { name: '@callstack/repack/babel-loader' }, filename: this.resourcePath, - src: source, - options: { - caller: { name: '@callstack/repack/babel-loader' }, - excludePlugins: options.excludePlugins, - // this is currently broken in Rspack and needs to be fixed upstream - // for now we can pass this as an option to loader - projectRoot: options.projectRoot, - sourceMaps: this.sourceMap, - }, }); // @ts-ignore callback(null, result.code, result.map); diff --git a/packages/repack/src/loaders/babelLoader/options.ts b/packages/repack/src/loaders/babelLoader/options.ts deleted file mode 100644 index c0033cb2e..000000000 --- a/packages/repack/src/loaders/babelLoader/options.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { LoaderContext } from '@rspack/core'; -import type { validate } from 'schema-utils'; - -export interface BabelLoaderOptions { - excludePlugins?: string[]; - projectRoot: string; -} - -type Schema = Parameters[0]; - -export const optionsSchema: Schema = { - type: 'object', - required: ['projectRoot'], - properties: { - projectRoot: { - type: 'string', - }, - excludePlugins: { - type: 'array', - items: { type: 'string' }, - }, - }, -}; - -export function getOptions( - loaderContext: LoaderContext -): BabelLoaderOptions { - const options = loaderContext.getOptions(loaderContext) || {}; - - // validate(optionsSchema, options, { name: 'repackBabelLoader' }); - - return options; -} diff --git a/packages/repack/src/loaders/babelLoader/utils.ts b/packages/repack/src/loaders/babelLoader/utils.ts index e7c83f11f..0359926c2 100644 --- a/packages/repack/src/loaders/babelLoader/utils.ts +++ b/packages/repack/src/loaders/babelLoader/utils.ts @@ -39,10 +39,10 @@ function resolveHermesParser(projectRoot: string) { } export async function loadHermesParser( - projectRoot: string + projectRoot?: string | null ): Promise { try { - const hermesParserPath = resolveHermesParser(projectRoot); + const hermesParserPath = resolveHermesParser(projectRoot ?? process.cwd()); const hermesParser = await import(hermesParserPath); return hermesParser; } catch (e) { @@ -52,5 +52,3 @@ export async function loadHermesParser( ); } } - -loadHermesParser(process.cwd()); From 9809ce0826968043ecd1bab3dfcc23213a5bb949 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 20:49:25 +0200 Subject: [PATCH 24/61] refactor: align hybrid loader --- .../src/loaders/hybridJsLoader/hybridJsLoader.ts | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts index 594a2bafd..ce62b7894 100644 --- a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts +++ b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts @@ -85,16 +85,13 @@ export default async function hybridJsLoader( ...customTransforms, ]; - const babelResult = await transform({ + const babelResult = await transform(source, { + caller: { name: '@callstack/repack/hybrid-js-loader' }, filename: this.resourcePath, - src: source, - options: { - caller: { name: '@callstack/repack/hybrid-js-loader' }, - projectRoot: projectRoot, - sourceMaps: this.sourceMap, - excludePlugins: excludeBabelPlugins, - includePlugins: includeBabelPlugins, - }, + root: projectRoot, + sourceMaps: this.sourceMap, + excludePlugins: excludeBabelPlugins, + includePlugins: includeBabelPlugins, }); const finalSwcConfig: SwcLoaderOptions = { From 99f06d1cfcf1e5cc0c399a3785c66ea20631e6c7 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 20:50:57 +0200 Subject: [PATCH 25/61] feat: skip reaniamted loader when hybrid loader is found --- apps/tester-app/rspack.config.mjs | 4 ++-- packages/plugin-reanimated/src/loader.ts | 28 +++++++++++++++++++++++- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 1d5bff9eb..7554c55ec 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -1,7 +1,7 @@ import path from 'node:path'; import * as Repack from '@callstack/repack'; import { NativeWindPlugin } from '@callstack/repack-plugin-nativewind'; -// import { ReanimatedPlugin } from '@callstack/repack-plugin-reanimated'; +import { ReanimatedPlugin } from '@callstack/repack-plugin-reanimated'; import { RsdoctorRspackPlugin } from '@rsdoctor/rspack-plugin'; const dirname = Repack.getDirname(import.meta.url); @@ -129,7 +129,7 @@ export default Repack.defineRspackConfig((env) => { // exclude: /index.bundle$/, // }), process.env.RSDOCTOR && new RsdoctorRspackPlugin(), - // new ReanimatedPlugin(), + new ReanimatedPlugin(), new NativeWindPlugin({ cssInteropOptions: { inlineRem: 16 } }), ].filter(Boolean), }; diff --git a/packages/plugin-reanimated/src/loader.ts b/packages/plugin-reanimated/src/loader.ts index dfc8a0f8d..2506ae92a 100644 --- a/packages/plugin-reanimated/src/loader.ts +++ b/packages/plugin-reanimated/src/loader.ts @@ -5,6 +5,10 @@ interface ReanimatedLoaderOptions { babelPlugins?: string[]; } +interface ReanimatedLoaderData { + skip?: boolean; +} + // Reference: https://github.com/software-mansion/react-native-reanimated/blob/3.16.3/packages/react-native-reanimated/plugin/src/autoworkletization.ts#L19-L59 const REANIMATED_AUTOWORKLETIZATION_KEYWORDS = [ 'worklet', @@ -39,7 +43,8 @@ export default function reanimatedLoader( const callback = this.async(); const options = this.getOptions(); - if (!REANIMATED_REGEX.test(source)) { + const loaderData = this.data as ReanimatedLoaderData; + if (loaderData.skip || !REANIMATED_REGEX.test(source)) { callback(null, source); return; } @@ -68,3 +73,24 @@ export default function reanimatedLoader( } ); } + +// resolve the path to the hybrid-js-loader once +const hybridJsLoaderPath = require.resolve( + '@callstack/repack/hybrid-js-loader' +); + +export function pitch( + this: LoaderContext, + _remainingRequest: string, + _previousRequest: string, + data: ReanimatedLoaderData +) { + for (const loader of this.loaders) { + // if the hybrid-js-loader is found, we skip the reanimated loader + // since hybrid-js-loader is more performant and uses the official + // babel plugin directly + if (loader.path === hybridJsLoaderPath) { + data.skip = true; + } + } +} From 9d27516221197ba92fef0578f457432992fddb0f Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 21:04:34 +0200 Subject: [PATCH 26/61] refactor: reuse isRspackCompiler --- packages/repack/src/plugins/DevelopmentPlugin.ts | 2 +- packages/repack/src/plugins/ModuleFederationPluginV1.ts | 2 +- packages/repack/src/plugins/ModuleFederationPluginV2.ts | 2 +- packages/repack/src/plugins/NativeEntryPlugin.ts | 2 +- packages/repack/src/utils/internal/index.ts | 3 ++- .../src/{plugins/utils => utils/internal}/isRspackCompiler.ts | 0 6 files changed, 6 insertions(+), 5 deletions(-) rename packages/repack/src/{plugins/utils => utils/internal}/isRspackCompiler.ts (100%) diff --git a/packages/repack/src/plugins/DevelopmentPlugin.ts b/packages/repack/src/plugins/DevelopmentPlugin.ts index df34db0c5..9ba73370d 100644 --- a/packages/repack/src/plugins/DevelopmentPlugin.ts +++ b/packages/repack/src/plugins/DevelopmentPlugin.ts @@ -7,7 +7,7 @@ import type { } from '@rspack/core'; import ReactRefreshPlugin from '@rspack/plugin-react-refresh'; import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler } from './utils/isRspackCompiler.js'; +import { isRspackCompiler } from '../utils/internal/index.js'; import { moveElementBefore } from './utils/moveElementBefore.js'; const [reactRefreshEntryPath, reactRefreshPath, refreshUtilsPath] = diff --git a/packages/repack/src/plugins/ModuleFederationPluginV1.ts b/packages/repack/src/plugins/ModuleFederationPluginV1.ts index ad1c664db..413aebffa 100644 --- a/packages/repack/src/plugins/ModuleFederationPluginV1.ts +++ b/packages/repack/src/plugins/ModuleFederationPluginV1.ts @@ -1,7 +1,7 @@ import type { Compiler as RspackCompiler, container } from '@rspack/core'; import type { Compiler as WebpackCompiler } from 'webpack'; import { Federated } from '../utils/federated.js'; -import { isRspackCompiler } from './utils/isRspackCompiler.js'; +import { isRspackCompiler } from '../utils/internal/index.js'; type MFPluginV1 = typeof container.ModuleFederationPluginV1; type MFPluginV1Options = ConstructorParameters[0]; diff --git a/packages/repack/src/plugins/ModuleFederationPluginV2.ts b/packages/repack/src/plugins/ModuleFederationPluginV2.ts index 07cc2a6fb..b8f763ee4 100644 --- a/packages/repack/src/plugins/ModuleFederationPluginV2.ts +++ b/packages/repack/src/plugins/ModuleFederationPluginV2.ts @@ -2,7 +2,7 @@ import type { moduleFederationPlugin as MF } from '@module-federation/sdk'; import type { Compiler as RspackCompiler } from '@rspack/core'; import { name as isIdentifier } from 'estree-util-is-identifier-name'; import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler } from './utils/isRspackCompiler.js'; +import { isRspackCompiler } from '../utils/internal/index.js'; type JsModuleDescriptor = { identifier: string; diff --git a/packages/repack/src/plugins/NativeEntryPlugin.ts b/packages/repack/src/plugins/NativeEntryPlugin.ts index 27aaac376..28d1c7b4a 100644 --- a/packages/repack/src/plugins/NativeEntryPlugin.ts +++ b/packages/repack/src/plugins/NativeEntryPlugin.ts @@ -1,7 +1,7 @@ import path from 'node:path'; import type { ResolveAlias, Compiler as RspackCompiler } from '@rspack/core'; import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler } from './utils/isRspackCompiler.js'; +import { isRspackCompiler } from '../utils/internal/index.js'; import { moveElementBefore } from './utils/moveElementBefore.js'; export interface NativeEntryPluginConfig { diff --git a/packages/repack/src/utils/internal/index.ts b/packages/repack/src/utils/internal/index.ts index 96a4cec64..6ce0c12ad 100644 --- a/packages/repack/src/utils/internal/index.ts +++ b/packages/repack/src/utils/internal/index.ts @@ -1 +1,2 @@ -export * from './swc.js'; +export * from './isRspackCompiler.js'; +export * from './swcConfigHelpers.js'; diff --git a/packages/repack/src/plugins/utils/isRspackCompiler.ts b/packages/repack/src/utils/internal/isRspackCompiler.ts similarity index 100% rename from packages/repack/src/plugins/utils/isRspackCompiler.ts rename to packages/repack/src/utils/internal/isRspackCompiler.ts From ae4d931d5ec62e285927e3218eac8ddd49f740a0 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 21:05:07 +0200 Subject: [PATCH 27/61] refactor: rename to swcConfigHelpers --- .../repack/src/utils/internal/{swc.ts => swcConfigHelpers.ts} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/repack/src/utils/internal/{swc.ts => swcConfigHelpers.ts} (100%) diff --git a/packages/repack/src/utils/internal/swc.ts b/packages/repack/src/utils/internal/swcConfigHelpers.ts similarity index 100% rename from packages/repack/src/utils/internal/swc.ts rename to packages/repack/src/utils/internal/swcConfigHelpers.ts From b799315a4b6dc0bd4ddbae6475e4bc6fc23eeb2c Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 22:25:20 +0200 Subject: [PATCH 28/61] refactor: add non-swc mode --- .../src/loaders/babelLoader/babelLoader.ts | 7 +- .../loaders/hybridJsLoader/hybridJsLoader.ts | 105 +++++++++++------- .../src/loaders/hybridJsLoader/utils.ts | 46 ++++++++ .../src/loaders/hybridJsLoader/utilts.ts | 21 ---- 4 files changed, 117 insertions(+), 62 deletions(-) create mode 100644 packages/repack/src/loaders/hybridJsLoader/utils.ts delete mode 100644 packages/repack/src/loaders/hybridJsLoader/utilts.ts diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 512b70b65..86016e692 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -80,7 +80,12 @@ export const transform = async ( throw new Error(`Failed to parse source file: ${options.filename}`); } - return transformFromAstSync(sourceAst, src, babelConfig); + const result = transformFromAstSync(sourceAst, src, babelConfig); + if (!result) { + throw new Error(`Failed to transform source file: ${options.filename}`); + } + + return result; }; export default async function babelLoader( diff --git a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts index ce62b7894..0e22732ba 100644 --- a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts +++ b/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts @@ -1,9 +1,4 @@ -import { rspack } from '@rspack/core'; -import type { - LoaderContext, - SwcLoaderOptions, - SwcLoaderParserConfig, -} from '@rspack/core'; +import type { LoaderContext, SwcLoaderOptions } from '@rspack/core'; import { getSupportedSwcConfigurableTransforms, getSupportedSwcCustomTransforms, @@ -13,62 +8,47 @@ import { transform } from '../babelLoader/index.js'; import type { HybridJsLoaderOptions } from './options.js'; import { getProjectBabelConfig, + getSwcParserConfig, isTSXSource, isTypeScriptSource, -} from './utilts.js'; + isWebpackCompiler, +} from './utils.js'; type BabelTransform = [string, Record | undefined]; - -const swc = rspack.experiments.swc; +type Swc = typeof import('@rspack/core').experiments.swc; export const raw = false; -export default async function hybridJsLoader( - this: LoaderContext, - source: string -) { - this.cacheable(); - const callback = this.async(); - const options = this.getOptions(); - - const filename = this.resourcePath; - const projectRoot = options.projectRoot; - const lazyImports = options.lazyImports ?? true; - - const includeBabelPlugins: Array]> = []; - - let parserConfig: SwcLoaderParserConfig; +function getExtraBabelPlugins(filename: string) { + const extraBabelPlugins: Array]> = []; // add TS syntax plugins since RN preset // only uses transform-typescript plugin // which includes the syntax-typescript plugin - if (isTypeScriptSource(this.resourcePath)) { - parserConfig = { syntax: 'typescript', tsx: false }; - includeBabelPlugins.push([ + if (isTypeScriptSource(filename)) { + extraBabelPlugins.push([ '@babel/plugin-syntax-typescript', { isTSX: false, allowNamespaces: true }, ]); } else if (isTSXSource(filename)) { - parserConfig = { syntax: 'typescript', tsx: true }; - includeBabelPlugins.push([ + extraBabelPlugins.push([ '@babel/plugin-syntax-typescript', { isTSX: true, allowNamespaces: true }, ]); - } else { - // include JSX in .js files - parserConfig = { syntax: 'ecmascript', jsx: true }; } + return extraBabelPlugins; +} - const babelConfig = getProjectBabelConfig(projectRoot); - const babelTransforms = - babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? []; - +function partitionTransforms( + filename: string, + babelTransforms: BabelTransform[] +) { let normalTransforms: string[] = []; let configurableTransforms: string[] = []; let customTransforms: string[] = []; let swcConfig: SwcLoaderOptions = { jsc: { - parser: parserConfig, + parser: getSwcParserConfig(filename), transform: { react: { useBuiltins: true } }, }, }; @@ -79,18 +59,63 @@ export default async function hybridJsLoader( ({ swcConfig, transformNames: customTransforms } = getSupportedSwcCustomTransforms(babelTransforms, swcConfig)); - const excludeBabelPlugins: string[] = [ + const includedSwcTransforms: string[] = [ ...normalTransforms, ...configurableTransforms, + ]; + + const supportedSwcTransforms: string[] = [ + ...includedSwcTransforms, ...customTransforms, ]; + return { includedSwcTransforms, supportedSwcTransforms, swcConfig }; +} + +export default async function hybridJsLoader( + this: LoaderContext, + source: string +) { + this.cacheable(); + const callback = this.async(); + const options = this.getOptions(); + + const filename = this.resourcePath; + const projectRoot = options.projectRoot; + const lazyImports = options.lazyImports ?? true; + + let swc: Swc | null = null; + if (!isWebpackCompiler(this._compiler)) { + const rspack = await import('@rspack/core'); + swc = rspack.default.experiments.swc; + } + + // if swc is not available, use babel to transform everything + if (!swc) { + const { code, map } = await transform(source, { + caller: { name: '@callstack/repack/hybrid-js-loader' }, + filename: this.resourcePath, + root: projectRoot, + sourceMaps: this.sourceMap, + }); + callback(null, code ?? undefined, map ?? undefined); + return; + } + + const babelConfig = getProjectBabelConfig(projectRoot); + const babelTransforms = + babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? []; + + const includeBabelPlugins = getExtraBabelPlugins(filename); + const { includedSwcTransforms, supportedSwcTransforms, swcConfig } = + partitionTransforms(filename, babelTransforms); + const babelResult = await transform(source, { caller: { name: '@callstack/repack/hybrid-js-loader' }, filename: this.resourcePath, root: projectRoot, sourceMaps: this.sourceMap, - excludePlugins: excludeBabelPlugins, + excludePlugins: supportedSwcTransforms, includePlugins: includeBabelPlugins, }); @@ -99,7 +124,7 @@ export default async function hybridJsLoader( // set env based on babel transforms env: { targets: { node: 24 }, - include: [...normalTransforms, ...configurableTransforms], + include: includedSwcTransforms, }, // set lazy imports based on loader options module: { diff --git a/packages/repack/src/loaders/hybridJsLoader/utils.ts b/packages/repack/src/loaders/hybridJsLoader/utils.ts new file mode 100644 index 000000000..3d8f52be2 --- /dev/null +++ b/packages/repack/src/loaders/hybridJsLoader/utils.ts @@ -0,0 +1,46 @@ +import { loadOptions } from '@babel/core'; +import type { + Compiler as RspackCompiler, + SwcLoaderParserConfig, +} from '@rspack/core'; +import type { Compiler as WebpackCompiler } from 'webpack'; +import { isRspackCompiler } from '../../utils/internal/index.js'; + +export function isTypeScriptSource(fileName: string) { + return !!fileName && fileName.endsWith('.ts'); +} + +export function isTSXSource(fileName: string) { + return !!fileName && fileName.endsWith('.tsx'); +} + +export function isJSXSource(fileName: string) { + return !!fileName && fileName.endsWith('.jsx'); +} + +export function getProjectBabelConfig(projectRoot: string) { + const babelConfig = loadOptions({ + cwd: projectRoot, + root: projectRoot, + }); + return babelConfig ?? {}; +} + +export function getSwcParserConfig(filename: string): SwcLoaderParserConfig { + if (isTypeScriptSource(filename)) { + return { syntax: 'typescript', tsx: false }; + } + if (isTSXSource(filename)) { + return { syntax: 'typescript', tsx: true }; + } + // include JSX in .js files + return { syntax: 'ecmascript', jsx: true }; +} + +export function isWebpackCompiler(compiler: RspackCompiler | WebpackCompiler) { + // context: parallel loader in Rspack has mocked compiler object without most props + // but in non-parallel mode, full compiler object is available so we can do the proper check + // we distinguish between parallel and non-parallel mode by checking if the compiler has a version property + // and then proceed to check if it's a Rspack compiler + return compiler.webpack.version && !isRspackCompiler(compiler); +} diff --git a/packages/repack/src/loaders/hybridJsLoader/utilts.ts b/packages/repack/src/loaders/hybridJsLoader/utilts.ts deleted file mode 100644 index f5dc10044..000000000 --- a/packages/repack/src/loaders/hybridJsLoader/utilts.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { loadOptions } from '@babel/core'; - -export function isTypeScriptSource(fileName: string) { - return !!fileName && fileName.endsWith('.ts'); -} - -export function isTSXSource(fileName: string) { - return !!fileName && fileName.endsWith('.tsx'); -} - -export function isJSXSource(fileName: string) { - return !!fileName && fileName.endsWith('.jsx'); -} - -export function getProjectBabelConfig(projectRoot: string) { - const babelConfig = loadOptions({ - cwd: projectRoot, - root: projectRoot, - }); - return babelConfig ?? {}; -} From 9b9337d5cca410e194c5709796596a67110c74c0 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 22:35:43 +0200 Subject: [PATCH 29/61] refactor: rename to babel-swc-loader --- apps/tester-app/rspack.config.mjs | 2 +- apps/tester-app/webpack.config.mjs | 5 ++++- .../configs/rspack.host-app.mts | 2 +- .../configs/rspack.mini-app.mts | 2 +- packages/plugin-nativewind/src/plugin.ts | 2 +- packages/plugin-reanimated/src/loader.ts | 12 +++++------- packages/plugin-reanimated/src/plugin.ts | 2 +- packages/repack/package.json | 2 +- .../babelSwcLoader.ts} | 19 +++++++++---------- .../src/loaders/babelSwcLoader/index.ts | 4 ++++ .../options.ts | 4 ++-- .../utils.ts | 0 .../src/loaders/hybridJsLoader/index.ts | 4 ---- 13 files changed, 30 insertions(+), 30 deletions(-) rename packages/repack/src/loaders/{hybridJsLoader/hybridJsLoader.ts => babelSwcLoader/babelSwcLoader.ts} (92%) create mode 100644 packages/repack/src/loaders/babelSwcLoader/index.ts rename packages/repack/src/loaders/{hybridJsLoader => babelSwcLoader}/options.ts (82%) rename packages/repack/src/loaders/{hybridJsLoader => babelSwcLoader}/utils.ts (100%) delete mode 100644 packages/repack/src/loaders/hybridJsLoader/index.ts diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 7554c55ec..058f31942 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -34,7 +34,7 @@ export default Repack.defineRspackConfig((env) => { { test: /\.[cm]?[jt]sx?$/, use: { - loader: '@callstack/repack/hybrid-js-loader', + loader: '@callstack/repack/babel-swc-loader', parallel: true, options: {}, }, diff --git a/apps/tester-app/webpack.config.mjs b/apps/tester-app/webpack.config.mjs index 933c6793c..494f31e4f 100644 --- a/apps/tester-app/webpack.config.mjs +++ b/apps/tester-app/webpack.config.mjs @@ -51,7 +51,10 @@ export default Repack.defineWebpackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: 'babel-loader', + use: { + loader: '@callstack/repack/babel-swc-loader', + options: {}, + }, type: 'javascript/auto', }, { diff --git a/apps/tester-federation-v2/configs/rspack.host-app.mts b/apps/tester-federation-v2/configs/rspack.host-app.mts index 2c60702d9..6822e80f5 100644 --- a/apps/tester-federation-v2/configs/rspack.host-app.mts +++ b/apps/tester-federation-v2/configs/rspack.host-app.mts @@ -23,7 +23,7 @@ export default Repack.defineRspackConfig((env) => { { test: /\.[cm]?[jt]sx?$/, use: { - loader: '@callstack/repack/hybrid-js-loader', + loader: '@callstack/repack/babel-swc-loader', parallel: true, options: { projectRoot: context }, }, diff --git a/apps/tester-federation-v2/configs/rspack.mini-app.mts b/apps/tester-federation-v2/configs/rspack.mini-app.mts index a541872b8..aaff8a208 100644 --- a/apps/tester-federation-v2/configs/rspack.mini-app.mts +++ b/apps/tester-federation-v2/configs/rspack.mini-app.mts @@ -23,7 +23,7 @@ export default Repack.defineRspackConfig((env) => { { test: /\.[cm]?[jt]sx?$/, use: { - loader: '@callstack/repack/hybrid-js-loader', + loader: '@callstack/repack/babel-swc-loader', parallel: true, options: { projectRoot: context }, }, diff --git a/packages/plugin-nativewind/src/plugin.ts b/packages/plugin-nativewind/src/plugin.ts index dfa157c96..d2d4e6002 100644 --- a/packages/plugin-nativewind/src/plugin.ts +++ b/packages/plugin-nativewind/src/plugin.ts @@ -152,7 +152,7 @@ export class NativeWindPlugin { * We look for any instances of the `builtin:swc-loader` in the Rspack configuration and modify their options * to include the NativeWind react import source. * - * TODO made obsolete by the new hybrid loader, remove in 6.0 + * TODO made obsolete by the new babel-swc-loader, remove in 6.0 */ compiler.options.module.rules.forEach((rule) => { if (!rule || typeof rule !== 'object') { diff --git a/packages/plugin-reanimated/src/loader.ts b/packages/plugin-reanimated/src/loader.ts index 2506ae92a..a3c33b681 100644 --- a/packages/plugin-reanimated/src/loader.ts +++ b/packages/plugin-reanimated/src/loader.ts @@ -74,10 +74,8 @@ export default function reanimatedLoader( ); } -// resolve the path to the hybrid-js-loader once -const hybridJsLoaderPath = require.resolve( - '@callstack/repack/hybrid-js-loader' -); +// resolve the path to the babel-swc-loader once +const babelSwcLoader = require.resolve('@callstack/repack/babel-swc-loader'); export function pitch( this: LoaderContext, @@ -86,10 +84,10 @@ export function pitch( data: ReanimatedLoaderData ) { for (const loader of this.loaders) { - // if the hybrid-js-loader is found, we skip the reanimated loader - // since hybrid-js-loader is more performant and uses the official + // if the babel-swc-loader is found, we skip the reanimated-loader + // since babel-swc-loader is more performant and uses the official // babel plugin directly - if (loader.path === hybridJsLoaderPath) { + if (loader.path === babelSwcLoader) { data.skip = true; } } diff --git a/packages/plugin-reanimated/src/plugin.ts b/packages/plugin-reanimated/src/plugin.ts index 36ef79b17..015613256 100644 --- a/packages/plugin-reanimated/src/plugin.ts +++ b/packages/plugin-reanimated/src/plugin.ts @@ -19,7 +19,7 @@ export class ReanimatedPlugin { const reanimatedVersion = this.getReanimatedVersion(reanimatedPath); // add rules for transpiling wih reanimated loader - // TODO made obsolete by the new hybrid loader, remove in 6.0 + // TODO made obsolete by the new babel-swc-loader, remove in 6.0 compiler.options.module.rules.push( reanimatedVersion.major < 4 ? reanimated3ModuleRules diff --git a/packages/repack/package.json b/packages/repack/package.json index 73d1d517b..a85321e99 100644 --- a/packages/repack/package.json +++ b/packages/repack/package.json @@ -11,8 +11,8 @@ "./commands/*": "./commands/*.js", "./assets-loader": "./dist/loaders/assetsLoader/index.js", "./babel-loader": "./dist/loaders/babelLoader/index.js", + "./babel-swc-loader": "./dist/loaders/babelSwcLoader/index.js", "./flow-loader": "./dist/loaders/flowLoader/index.js", - "./hybrid-js-loader": "./dist/loaders/hybridJsLoader/index.js", "./react-refresh-loader": "./dist/loaders/reactRefreshLoader/index.js", "./mf/*": "./mf/*.js", "./package.json": "./package.json" diff --git a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts similarity index 92% rename from packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts rename to packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index 0e22732ba..d0e62112b 100644 --- a/packages/repack/src/loaders/hybridJsLoader/hybridJsLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -5,7 +5,7 @@ import { getSupportedSwcNormalTransforms, } from '../../utils/internal/index.js'; import { transform } from '../babelLoader/index.js'; -import type { HybridJsLoaderOptions } from './options.js'; +import type { BabelSwcLoaderOptions } from './options.js'; import { getProjectBabelConfig, getSwcParserConfig, @@ -72,8 +72,8 @@ function partitionTransforms( return { includedSwcTransforms, supportedSwcTransforms, swcConfig }; } -export default async function hybridJsLoader( - this: LoaderContext, +export default async function babelSwcLoader( + this: LoaderContext, source: string ) { this.cacheable(); @@ -93,7 +93,7 @@ export default async function hybridJsLoader( // if swc is not available, use babel to transform everything if (!swc) { const { code, map } = await transform(source, { - caller: { name: '@callstack/repack/hybrid-js-loader' }, + caller: { name: '@callstack/repack/babel-swc-loader' }, filename: this.resourcePath, root: projectRoot, sourceMaps: this.sourceMap, @@ -111,7 +111,7 @@ export default async function hybridJsLoader( partitionTransforms(filename, babelTransforms); const babelResult = await transform(source, { - caller: { name: '@callstack/repack/hybrid-js-loader' }, + caller: { name: '@callstack/repack/babel-swc-loader' }, filename: this.resourcePath, root: projectRoot, sourceMaps: this.sourceMap, @@ -136,18 +136,17 @@ export default async function hybridJsLoader( const swcResult = swc.transformSync(babelResult?.code!, { ...finalSwcConfig, + caller: { name: '@callstack/repack/babel-swc-loader' }, filename: this.resourcePath, + configFile: false, + swcrc: false, root: projectRoot, + minify: false, sourceMaps: this.sourceMap, // TODO potentially optimize with fast-stringify inputSourceMap: JSON.stringify(babelResult?.map), - // TODO is this needed? sourceRoot: babelResult?.map?.sourceRoot, sourceFileName: babelResult?.map?.file, - minify: false, - configFile: false, - swcrc: false, - caller: { name: 'repack-hybrid-js-loader' }, }); callback(null, swcResult?.code, swcResult?.map); diff --git a/packages/repack/src/loaders/babelSwcLoader/index.ts b/packages/repack/src/loaders/babelSwcLoader/index.ts new file mode 100644 index 000000000..229c76518 --- /dev/null +++ b/packages/repack/src/loaders/babelSwcLoader/index.ts @@ -0,0 +1,4 @@ +import babelSwcLoader, { raw } from './babelSwcLoader.js'; + +export { raw }; +export default babelSwcLoader; diff --git a/packages/repack/src/loaders/hybridJsLoader/options.ts b/packages/repack/src/loaders/babelSwcLoader/options.ts similarity index 82% rename from packages/repack/src/loaders/hybridJsLoader/options.ts rename to packages/repack/src/loaders/babelSwcLoader/options.ts index a84613adc..c0de3ea12 100644 --- a/packages/repack/src/loaders/hybridJsLoader/options.ts +++ b/packages/repack/src/loaders/babelSwcLoader/options.ts @@ -1,9 +1,9 @@ -export interface HybridJsLoaderOptions { +export interface BabelSwcLoaderOptions { lazyImports?: boolean | string[]; projectRoot: string; } -export function validateOptions(options: HybridJsLoaderOptions) { +export function validateOptions(options: BabelSwcLoaderOptions) { if (!options.projectRoot || typeof options.projectRoot !== 'string') { throw new Error( 'Option `projectRoot` is required and must be of type string' diff --git a/packages/repack/src/loaders/hybridJsLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts similarity index 100% rename from packages/repack/src/loaders/hybridJsLoader/utils.ts rename to packages/repack/src/loaders/babelSwcLoader/utils.ts diff --git a/packages/repack/src/loaders/hybridJsLoader/index.ts b/packages/repack/src/loaders/hybridJsLoader/index.ts deleted file mode 100644 index 17482a37f..000000000 --- a/packages/repack/src/loaders/hybridJsLoader/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -import hybridJsLoader, { raw } from './hybridJsLoader.js'; - -export { raw }; -export default hybridJsLoader; From 05108729b212f39021a3c078579094afc69e112e Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 22:40:23 +0200 Subject: [PATCH 30/61] chore: comment --- packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index d0e62112b..9e3883150 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -84,6 +84,8 @@ export default async function babelSwcLoader( const projectRoot = options.projectRoot; const lazyImports = options.lazyImports ?? true; + // TODO this should come from `this._compiler` + // needs to be exposed in Rspack let swc: Swc | null = null; if (!isWebpackCompiler(this._compiler)) { const rspack = await import('@rspack/core'); From d7e2fd1fce49338155675d5ea0dcaf47b881bf4f Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 23:32:41 +0200 Subject: [PATCH 31/61] feat: add disabled parallel mode warning --- .../loaders/babelSwcLoader/babelSwcLoader.ts | 28 +++++++++++++++++-- .../src/loaders/babelSwcLoader/utils.ts | 11 ++++++++ packages/repack/src/plugins/LoggerPlugin.ts | 4 +-- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index 9e3883150..c59327668 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -9,6 +9,7 @@ import type { BabelSwcLoaderOptions } from './options.js'; import { getProjectBabelConfig, getSwcParserConfig, + isParallelModeAvailable, isTSXSource, isTypeScriptSource, isWebpackCompiler, @@ -72,14 +73,35 @@ function partitionTransforms( return { includedSwcTransforms, supportedSwcTransforms, swcConfig }; } +const disabledParalleModeWarning = [ + 'You have enabled `experiments.parallelLoader` but forgot to enable it for this loader.', + 'To enable parallel mode for this loader you need to add `parallel: true` to the loader rule.', + 'See how to do it in the official Rspack docs:', + 'https://rspack.rs/config/experiments#experimentsparallelloader', +].join(' '); + +let parallelModeWarningDisplayed = false; + export default async function babelSwcLoader( this: LoaderContext, source: string ) { this.cacheable(); const callback = this.async(); + const loaderName = '@callstack/repack/babel-swc-loader'; + const logger = this.getLogger('BabelSwcLoader'); const options = this.getOptions(); + this._compiler; + + if ( + isParallelModeAvailable(this._compiler) && + !parallelModeWarningDisplayed + ) { + logger.warn(disabledParalleModeWarning); + parallelModeWarningDisplayed = true; + } + const filename = this.resourcePath; const projectRoot = options.projectRoot; const lazyImports = options.lazyImports ?? true; @@ -95,7 +117,7 @@ export default async function babelSwcLoader( // if swc is not available, use babel to transform everything if (!swc) { const { code, map } = await transform(source, { - caller: { name: '@callstack/repack/babel-swc-loader' }, + caller: { name: loaderName }, filename: this.resourcePath, root: projectRoot, sourceMaps: this.sourceMap, @@ -113,7 +135,7 @@ export default async function babelSwcLoader( partitionTransforms(filename, babelTransforms); const babelResult = await transform(source, { - caller: { name: '@callstack/repack/babel-swc-loader' }, + caller: { name: loaderName }, filename: this.resourcePath, root: projectRoot, sourceMaps: this.sourceMap, @@ -138,7 +160,7 @@ export default async function babelSwcLoader( const swcResult = swc.transformSync(babelResult?.code!, { ...finalSwcConfig, - caller: { name: '@callstack/repack/babel-swc-loader' }, + caller: { name: loaderName }, filename: this.resourcePath, configFile: false, swcrc: false, diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index 3d8f52be2..e9adf297d 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -44,3 +44,14 @@ export function isWebpackCompiler(compiler: RspackCompiler | WebpackCompiler) { // and then proceed to check if it's a Rspack compiler return compiler.webpack.version && !isRspackCompiler(compiler); } + +export function isParallelModeAvailable( + compiler: RspackCompiler | WebpackCompiler +) { + // only available with Rspack + if (!isRspackCompiler(compiler)) { + return false; + } + + return !!(compiler as RspackCompiler).options.experiments?.parallelLoader; +} diff --git a/packages/repack/src/plugins/LoggerPlugin.ts b/packages/repack/src/plugins/LoggerPlugin.ts index 0fd3682c1..5ce930caf 100644 --- a/packages/repack/src/plugins/LoggerPlugin.ts +++ b/packages/repack/src/plugins/LoggerPlugin.ts @@ -90,9 +90,7 @@ export class LoggerPlugin { if (LoggerPlugin.SUPPORTED_TYPES.includes(type)) { return { timestamp: timestamp ?? Date.now(), - issuer: issuer.includes('reactNativeAssetsLoader') - ? 'reactNativeAssetsLoader' - : issuer, + issuer: issuer.includes('Loader|') ? issuer.split('|')[0] : issuer, type: type as LogType, message: args, }; From 035e4c69b7cde2ccae0b9351f04ad5d5ec051d0d Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 23:37:54 +0200 Subject: [PATCH 32/61] feat: add option to disable the warning --- .../repack/src/loaders/babelSwcLoader/babelSwcLoader.ts | 9 +++++---- packages/repack/src/loaders/babelSwcLoader/options.ts | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index c59327668..13b32c347 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -77,7 +77,9 @@ const disabledParalleModeWarning = [ 'You have enabled `experiments.parallelLoader` but forgot to enable it for this loader.', 'To enable parallel mode for this loader you need to add `parallel: true` to the loader rule.', 'See how to do it in the official Rspack docs:', - 'https://rspack.rs/config/experiments#experimentsparallelloader', + 'https://rspack.rs/config/experiments#experimentsparallelloader.', + 'If this is intentional, you can disable this warning', + 'by setting `hideParallelModeWarning` in the loader options.', ].join(' '); let parallelModeWarningDisplayed = false; @@ -92,11 +94,10 @@ export default async function babelSwcLoader( const logger = this.getLogger('BabelSwcLoader'); const options = this.getOptions(); - this._compiler; - if ( isParallelModeAvailable(this._compiler) && - !parallelModeWarningDisplayed + !parallelModeWarningDisplayed && + !options.hideParallelModeWarning ) { logger.warn(disabledParalleModeWarning); parallelModeWarningDisplayed = true; diff --git a/packages/repack/src/loaders/babelSwcLoader/options.ts b/packages/repack/src/loaders/babelSwcLoader/options.ts index c0de3ea12..177b203cc 100644 --- a/packages/repack/src/loaders/babelSwcLoader/options.ts +++ b/packages/repack/src/loaders/babelSwcLoader/options.ts @@ -1,4 +1,5 @@ export interface BabelSwcLoaderOptions { + hideParallelModeWarning?: boolean; lazyImports?: boolean | string[]; projectRoot: string; } From d7c80f622cb31134059195cf3080810daf42ef3b Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 23:42:49 +0200 Subject: [PATCH 33/61] fix: use babel resolved root as fallback --- .../loaders/babelSwcLoader/babelSwcLoader.ts | 11 ++++++--- .../src/loaders/babelSwcLoader/options.ts | 24 ------------------- .../src/loaders/babelSwcLoader/utils.ts | 7 ++---- 3 files changed, 10 insertions(+), 32 deletions(-) delete mode 100644 packages/repack/src/loaders/babelSwcLoader/options.ts diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index 13b32c347..90e981960 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -5,7 +5,6 @@ import { getSupportedSwcNormalTransforms, } from '../../utils/internal/index.js'; import { transform } from '../babelLoader/index.js'; -import type { BabelSwcLoaderOptions } from './options.js'; import { getProjectBabelConfig, getSwcParserConfig, @@ -18,6 +17,12 @@ import { type BabelTransform = [string, Record | undefined]; type Swc = typeof import('@rspack/core').experiments.swc; +export interface BabelSwcLoaderOptions { + hideParallelModeWarning?: boolean; + lazyImports?: boolean | string[]; + projectRoot?: string; +} + export const raw = false; function getExtraBabelPlugins(filename: string) { @@ -138,7 +143,7 @@ export default async function babelSwcLoader( const babelResult = await transform(source, { caller: { name: loaderName }, filename: this.resourcePath, - root: projectRoot, + root: projectRoot ?? babelConfig.root, sourceMaps: this.sourceMap, excludePlugins: supportedSwcTransforms, includePlugins: includeBabelPlugins, @@ -165,7 +170,7 @@ export default async function babelSwcLoader( filename: this.resourcePath, configFile: false, swcrc: false, - root: projectRoot, + root: projectRoot ?? babelConfig.root ?? undefined, minify: false, sourceMaps: this.sourceMap, // TODO potentially optimize with fast-stringify diff --git a/packages/repack/src/loaders/babelSwcLoader/options.ts b/packages/repack/src/loaders/babelSwcLoader/options.ts deleted file mode 100644 index 177b203cc..000000000 --- a/packages/repack/src/loaders/babelSwcLoader/options.ts +++ /dev/null @@ -1,24 +0,0 @@ -export interface BabelSwcLoaderOptions { - hideParallelModeWarning?: boolean; - lazyImports?: boolean | string[]; - projectRoot: string; -} - -export function validateOptions(options: BabelSwcLoaderOptions) { - if (!options.projectRoot || typeof options.projectRoot !== 'string') { - throw new Error( - 'Option `projectRoot` is required and must be of type string' - ); - } - - if (options.lazyImports) { - if ( - typeof options.lazyImports !== 'boolean' && - !Array.isArray(options.lazyImports) - ) { - throw new Error( - 'Option `lazyImports` must be of type boolean or an array of strings' - ); - } - } -} diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index e9adf297d..4116d8059 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -18,11 +18,8 @@ export function isJSXSource(fileName: string) { return !!fileName && fileName.endsWith('.jsx'); } -export function getProjectBabelConfig(projectRoot: string) { - const babelConfig = loadOptions({ - cwd: projectRoot, - root: projectRoot, - }); +export function getProjectBabelConfig(projectRoot?: string) { + const babelConfig = loadOptions({ cwd: projectRoot, root: projectRoot }); return babelConfig ?? {}; } From 37b02d98b8cc56d74a6f4766c0fd6467db12d78b Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 4 Aug 2025 23:47:52 +0200 Subject: [PATCH 34/61] chore: align loaders in testers --- apps/tester-app/rspack.config.mjs | 1 - apps/tester-app/webpack.config.mjs | 5 +---- .../configs/rspack.host-app.mts | 2 +- .../configs/rspack.mini-app.mts | 2 +- .../configs/webpack.host-app.mts | 2 +- .../configs/webpack.mini-app.mts | 2 +- apps/tester-federation/configs/rspack.host-app.mts | 13 ++++++++++++- apps/tester-federation/configs/rspack.mini-app.mts | 13 ++++++++++++- apps/tester-federation/configs/webpack.host-app.mts | 2 +- apps/tester-federation/configs/webpack.mini-app.mts | 2 +- 10 files changed, 31 insertions(+), 13 deletions(-) diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 058f31942..24c5dafff 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -35,7 +35,6 @@ export default Repack.defineRspackConfig((env) => { test: /\.[cm]?[jt]sx?$/, use: { loader: '@callstack/repack/babel-swc-loader', - parallel: true, options: {}, }, type: 'javascript/auto', diff --git a/apps/tester-app/webpack.config.mjs b/apps/tester-app/webpack.config.mjs index 494f31e4f..ccef59a74 100644 --- a/apps/tester-app/webpack.config.mjs +++ b/apps/tester-app/webpack.config.mjs @@ -51,10 +51,7 @@ export default Repack.defineWebpackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: { - loader: '@callstack/repack/babel-swc-loader', - options: {}, - }, + use: '@callstack/repack/babel-swc-loader', type: 'javascript/auto', }, { diff --git a/apps/tester-federation-v2/configs/rspack.host-app.mts b/apps/tester-federation-v2/configs/rspack.host-app.mts index 6822e80f5..87cde819f 100644 --- a/apps/tester-federation-v2/configs/rspack.host-app.mts +++ b/apps/tester-federation-v2/configs/rspack.host-app.mts @@ -25,7 +25,7 @@ export default Repack.defineRspackConfig((env) => { use: { loader: '@callstack/repack/babel-swc-loader', parallel: true, - options: { projectRoot: context }, + options: {}, }, type: 'javascript/auto', }, diff --git a/apps/tester-federation-v2/configs/rspack.mini-app.mts b/apps/tester-federation-v2/configs/rspack.mini-app.mts index aaff8a208..f2aeabce8 100644 --- a/apps/tester-federation-v2/configs/rspack.mini-app.mts +++ b/apps/tester-federation-v2/configs/rspack.mini-app.mts @@ -25,7 +25,7 @@ export default Repack.defineRspackConfig((env) => { use: { loader: '@callstack/repack/babel-swc-loader', parallel: true, - options: { projectRoot: context }, + options: {}, }, type: 'javascript/auto', }, diff --git a/apps/tester-federation-v2/configs/webpack.host-app.mts b/apps/tester-federation-v2/configs/webpack.host-app.mts index 2e314f944..3e634baf8 100644 --- a/apps/tester-federation-v2/configs/webpack.host-app.mts +++ b/apps/tester-federation-v2/configs/webpack.host-app.mts @@ -20,7 +20,7 @@ export default Repack.defineWebpackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: 'babel-loader', + use: '@callstack/repack/babel-swc-loader', type: 'javascript/auto', }, ...Repack.getAssetTransformRules(), diff --git a/apps/tester-federation-v2/configs/webpack.mini-app.mts b/apps/tester-federation-v2/configs/webpack.mini-app.mts index 2752d2d87..a09eda442 100644 --- a/apps/tester-federation-v2/configs/webpack.mini-app.mts +++ b/apps/tester-federation-v2/configs/webpack.mini-app.mts @@ -19,7 +19,7 @@ export default Repack.defineWebpackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: 'babel-loader', + use: '@callstack/repack/babel-swc-loader', type: 'javascript/auto', }, ...Repack.getAssetTransformRules({ inline: true }), diff --git a/apps/tester-federation/configs/rspack.host-app.mts b/apps/tester-federation/configs/rspack.host-app.mts index 0117fb0fc..33efbec4a 100644 --- a/apps/tester-federation/configs/rspack.host-app.mts +++ b/apps/tester-federation/configs/rspack.host-app.mts @@ -9,6 +9,9 @@ export default Repack.defineRspackConfig((env) => { mode, context, entry: './src/host/index.js', + experiments: { + parallelLoader: true, + }, resolve: { ...Repack.getResolveOptions({ enablePackageExports: true }), }, @@ -18,7 +21,15 @@ export default Repack.defineRspackConfig((env) => { }, module: { rules: [ - ...Repack.getJsTransformRules(), + { + test: /\.[cm]?[jt]sx?$/, + type: 'javascript/auto', + use: { + loader: '@callstack/repack/babel-swc-loader', + parallel: true, + options: {}, + }, + }, ...Repack.getAssetTransformRules(), ], }, diff --git a/apps/tester-federation/configs/rspack.mini-app.mts b/apps/tester-federation/configs/rspack.mini-app.mts index 42c6d9111..ca5924a2d 100644 --- a/apps/tester-federation/configs/rspack.mini-app.mts +++ b/apps/tester-federation/configs/rspack.mini-app.mts @@ -9,6 +9,9 @@ export default Repack.defineRspackConfig((env) => { mode, context, entry: './src/mini/index.js', + experiments: { + parallelLoader: true, + }, resolve: { ...Repack.getResolveOptions({ enablePackageExports: true }), }, @@ -18,7 +21,15 @@ export default Repack.defineRspackConfig((env) => { }, module: { rules: [ - ...Repack.getJsTransformRules(), + { + test: /\.[cm]?[jt]sx?$/, + use: { + loader: '@callstack/repack/babel-swc-loader', + parallel: true, + options: {}, + }, + type: 'javascript/auto', + }, ...Repack.getAssetTransformRules({ inline: true }), ], }, diff --git a/apps/tester-federation/configs/webpack.host-app.mts b/apps/tester-federation/configs/webpack.host-app.mts index da73ff3cd..8831b2c96 100644 --- a/apps/tester-federation/configs/webpack.host-app.mts +++ b/apps/tester-federation/configs/webpack.host-app.mts @@ -19,7 +19,7 @@ export default Repack.defineWebpackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: 'babel-loader', + use: '@callstack/repack/babel-swc-loader', type: 'javascript/auto', }, ...Repack.getAssetTransformRules(), diff --git a/apps/tester-federation/configs/webpack.mini-app.mts b/apps/tester-federation/configs/webpack.mini-app.mts index dc60f1c9a..8ff9e4ac3 100644 --- a/apps/tester-federation/configs/webpack.mini-app.mts +++ b/apps/tester-federation/configs/webpack.mini-app.mts @@ -19,7 +19,7 @@ export default Repack.defineWebpackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: 'babel-loader', + use: '@callstack/repack/babel-swc-loader', type: 'javascript/auto', }, ...Repack.getAssetTransformRules({ inline: true }), From 8e4dc89957afd3632f675b580a646389a4bb23d1 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Tue, 5 Aug 2025 01:19:12 +0200 Subject: [PATCH 35/61] fix: tests --- apps/tester-app/__tests__/configs/webpack.config.mjs | 2 +- apps/tester-app/rspack.config.mjs | 1 + packages/repack/src/utils/internal/swcConfigHelpers.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/tester-app/__tests__/configs/webpack.config.mjs b/apps/tester-app/__tests__/configs/webpack.config.mjs index 8546cfe68..40540d133 100644 --- a/apps/tester-app/__tests__/configs/webpack.config.mjs +++ b/apps/tester-app/__tests__/configs/webpack.config.mjs @@ -8,7 +8,7 @@ export default async (env) => { path: process.env.TEST_WEBPACK_OUTPUT_DIR, }, experiments: { - ...config.output.experiments, + ...config.experiments, lazyCompilation: false, }, }; diff --git a/apps/tester-app/rspack.config.mjs b/apps/tester-app/rspack.config.mjs index 24c5dafff..058f31942 100644 --- a/apps/tester-app/rspack.config.mjs +++ b/apps/tester-app/rspack.config.mjs @@ -35,6 +35,7 @@ export default Repack.defineRspackConfig((env) => { test: /\.[cm]?[jt]sx?$/, use: { loader: '@callstack/repack/babel-swc-loader', + parallel: true, options: {}, }, type: 'javascript/auto', diff --git a/packages/repack/src/utils/internal/swcConfigHelpers.ts b/packages/repack/src/utils/internal/swcConfigHelpers.ts index a1a4d7843..e04888bd3 100644 --- a/packages/repack/src/utils/internal/swcConfigHelpers.ts +++ b/packages/repack/src/utils/internal/swcConfigHelpers.ts @@ -109,6 +109,7 @@ function getTransformModulesCommonjsConfig( strict: Boolean(moduleConfig.strict), strictMode: Boolean(moduleConfig.strictMode), allowTopLevelThis: Boolean(moduleConfig.allowTopLevelThis), + ignoreDynamic: true, }, }; } From c111697978fe2a8fd1701f0eadda04a4e89f4925 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Tue, 5 Aug 2025 23:42:52 +0200 Subject: [PATCH 36/61] fix: sourcemaps settings --- .../loaders/babelSwcLoader/babelSwcLoader.ts | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index 90e981960..b80f30579 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -1,3 +1,4 @@ +import type { TransformOptions } from '@babel/core'; import type { LoaderContext, SwcLoaderOptions } from '@rspack/core'; import { getSupportedSwcConfigurableTransforms, @@ -15,6 +16,7 @@ import { } from './utils.js'; type BabelTransform = [string, Record | undefined]; +type InputSourceMap = TransformOptions['inputSourceMap']; type Swc = typeof import('@rspack/core').experiments.swc; export interface BabelSwcLoaderOptions { @@ -91,7 +93,8 @@ let parallelModeWarningDisplayed = false; export default async function babelSwcLoader( this: LoaderContext, - source: string + source: string, + sourceMap: string | undefined ) { this.cacheable(); const callback = this.async(); @@ -108,10 +111,22 @@ export default async function babelSwcLoader( parallelModeWarningDisplayed = true; } - const filename = this.resourcePath; + const inputSourceMap: InputSourceMap = sourceMap + ? JSON.parse(sourceMap) + : undefined; const projectRoot = options.projectRoot; const lazyImports = options.lazyImports ?? true; + const baseBabelConfig = { + caller: { name: loaderName }, + root: projectRoot, + filename: this.resourcePath, + sourceMaps: this.sourceMap, + sourceFileName: this.resourcePath, + sourceRoot: this.context, + inputSourceMap: inputSourceMap, + }; + // TODO this should come from `this._compiler` // needs to be exposed in Rspack let swc: Swc | null = null; @@ -122,12 +137,7 @@ export default async function babelSwcLoader( // if swc is not available, use babel to transform everything if (!swc) { - const { code, map } = await transform(source, { - caller: { name: loaderName }, - filename: this.resourcePath, - root: projectRoot, - sourceMaps: this.sourceMap, - }); + const { code, map } = await transform(source, baseBabelConfig); callback(null, code ?? undefined, map ?? undefined); return; } @@ -136,15 +146,12 @@ export default async function babelSwcLoader( const babelTransforms = babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? []; - const includeBabelPlugins = getExtraBabelPlugins(filename); + const includeBabelPlugins = getExtraBabelPlugins(this.resourcePath); const { includedSwcTransforms, supportedSwcTransforms, swcConfig } = - partitionTransforms(filename, babelTransforms); + partitionTransforms(this.resourcePath, babelTransforms); const babelResult = await transform(source, { - caller: { name: loaderName }, - filename: this.resourcePath, - root: projectRoot ?? babelConfig.root, - sourceMaps: this.sourceMap, + ...baseBabelConfig, excludePlugins: supportedSwcTransforms, includePlugins: includeBabelPlugins, }); @@ -173,10 +180,9 @@ export default async function babelSwcLoader( root: projectRoot ?? babelConfig.root ?? undefined, minify: false, sourceMaps: this.sourceMap, - // TODO potentially optimize with fast-stringify inputSourceMap: JSON.stringify(babelResult?.map), - sourceRoot: babelResult?.map?.sourceRoot, - sourceFileName: babelResult?.map?.file, + sourceFileName: this.resourcePath, + sourceRoot: this.context!, }); callback(null, swcResult?.code, swcResult?.map); From 8cd37d5520061ecd7b84d67df1ef87fddf952c12 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 6 Aug 2025 16:31:35 +0200 Subject: [PATCH 37/61] feat: support multiple ways to obtain swc --- .../loaders/babelSwcLoader/babelSwcLoader.ts | 44 ++++---- .../src/loaders/babelSwcLoader/options.ts | 12 +++ .../src/loaders/babelSwcLoader/utils.ts | 102 +++++++++++++++--- 3 files changed, 122 insertions(+), 36 deletions(-) create mode 100644 packages/repack/src/loaders/babelSwcLoader/options.ts diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index b80f30579..c4d8f8940 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -6,24 +6,19 @@ import { getSupportedSwcNormalTransforms, } from '../../utils/internal/index.js'; import { transform } from '../babelLoader/index.js'; +import type { BabelSwcLoaderOptions } from './options.js'; import { getProjectBabelConfig, + getProjectRootPath, getSwcParserConfig, isParallelModeAvailable, isTSXSource, isTypeScriptSource, - isWebpackCompiler, + lazyGetSwc, } from './utils.js'; type BabelTransform = [string, Record | undefined]; type InputSourceMap = TransformOptions['inputSourceMap']; -type Swc = typeof import('@rspack/core').experiments.swc; - -export interface BabelSwcLoaderOptions { - hideParallelModeWarning?: boolean; - lazyImports?: boolean | string[]; - projectRoot?: string; -} export const raw = false; @@ -103,7 +98,7 @@ export default async function babelSwcLoader( const options = this.getOptions(); if ( - isParallelModeAvailable(this._compiler) && + isParallelModeAvailable(this) && !parallelModeWarningDisplayed && !options.hideParallelModeWarning ) { @@ -114,27 +109,25 @@ export default async function babelSwcLoader( const inputSourceMap: InputSourceMap = sourceMap ? JSON.parse(sourceMap) : undefined; - const projectRoot = options.projectRoot; const lazyImports = options.lazyImports ?? true; + const projectRoot = getProjectRootPath(this); + + const withSourceMaps = this.resourcePath.match(/node_modules/) + ? false + : this.sourceMap; - const baseBabelConfig = { + const baseBabelConfig: TransformOptions = { caller: { name: loaderName }, root: projectRoot, filename: this.resourcePath, - sourceMaps: this.sourceMap, + sourceMaps: withSourceMaps, sourceFileName: this.resourcePath, sourceRoot: this.context, - inputSourceMap: inputSourceMap, + inputSourceMap: withSourceMaps ? inputSourceMap : undefined, + ...options.babelOverrides, }; - // TODO this should come from `this._compiler` - // needs to be exposed in Rspack - let swc: Swc | null = null; - if (!isWebpackCompiler(this._compiler)) { - const rspack = await import('@rspack/core'); - swc = rspack.default.experiments.swc; - } - + const swc = await lazyGetSwc(this); // if swc is not available, use babel to transform everything if (!swc) { const { code, map } = await transform(source, baseBabelConfig); @@ -160,6 +153,8 @@ export default async function babelSwcLoader( ...swcConfig, // set env based on babel transforms env: { + // node supports everything and does not include + // any transforms by default, so it can as a template targets: { node: 24 }, include: includedSwcTransforms, }, @@ -179,10 +174,13 @@ export default async function babelSwcLoader( swcrc: false, root: projectRoot ?? babelConfig.root ?? undefined, minify: false, - sourceMaps: this.sourceMap, - inputSourceMap: JSON.stringify(babelResult?.map), + sourceMaps: withSourceMaps, + inputSourceMap: withSourceMaps + ? JSON.stringify(babelResult?.map) + : undefined, sourceFileName: this.resourcePath, sourceRoot: this.context!, + ...options.swcOverrides, }); callback(null, swcResult?.code, swcResult?.map); diff --git a/packages/repack/src/loaders/babelSwcLoader/options.ts b/packages/repack/src/loaders/babelSwcLoader/options.ts new file mode 100644 index 000000000..394acf878 --- /dev/null +++ b/packages/repack/src/loaders/babelSwcLoader/options.ts @@ -0,0 +1,12 @@ +import type { TransformOptions } from '@babel/core'; +import type { SwcLoaderOptions } from '@rspack/core'; + +type BabelOverrides = TransformOptions; +type SwcOverrides = Omit; + +export interface BabelSwcLoaderOptions { + hideParallelModeWarning?: boolean; + lazyImports?: boolean | string[]; + babelOverrides?: BabelOverrides; + swcOverrides?: SwcOverrides; +} diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index 4116d8059..56374b31a 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -1,10 +1,11 @@ import { loadOptions } from '@babel/core'; import type { - Compiler as RspackCompiler, + LoaderContext, SwcLoaderParserConfig, + experiments, } from '@rspack/core'; -import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler } from '../../utils/internal/index.js'; + +type Swc = (typeof experiments)['swc']; export function isTypeScriptSource(fileName: string) { return !!fileName && fileName.endsWith('.ts'); @@ -34,21 +35,96 @@ export function getSwcParserConfig(filename: string): SwcLoaderParserConfig { return { syntax: 'ecmascript', jsx: true }; } -export function isWebpackCompiler(compiler: RspackCompiler | WebpackCompiler) { - // context: parallel loader in Rspack has mocked compiler object without most props +function isWebpackBackend(loaderContext: LoaderContext) { + // parallel loader in Rspack has mocked compiler object without most props // but in non-parallel mode, full compiler object is available so we can do the proper check // we distinguish between parallel and non-parallel mode by checking if the compiler has a version property - // and then proceed to check if it's a Rspack compiler - return compiler.webpack.version && !isRspackCompiler(compiler); + // and then proceed to check if it's a Rspack compiler the official way + if ( + 'webpack' in loaderContext._compiler && + 'version' in loaderContext._compiler.webpack && + loaderContext._compiler.webpack.version + ) { + return !('rspackVersion' in loaderContext._compiler.webpack); + } + // in threaded-loader mode, _compiler.webpack is undefined + // loaderContext.webpack exists in webpack but not in Rspack + // in case it's added in the future, it should be followed by similar rspack prop + if ('webpack' in loaderContext && loaderContext.webpack) { + return !('rspack' in loaderContext && loaderContext.rspack); + } + // if both checks fail, we assume it's a Rspack compiler + return false; } -export function isParallelModeAvailable( - compiler: RspackCompiler | WebpackCompiler -) { - // only available with Rspack - if (!isRspackCompiler(compiler)) { +export function isParallelModeAvailable(loaderContext: LoaderContext) { + if (isWebpackBackend(loaderContext)) { return false; } + return !!loaderContext._compiler.options.experiments?.parallelLoader; +} + +export function getProjectRootPath( + loaderContext: LoaderContext +): string | undefined { + // parallel loaders in Rspack had a bug where rootContext + // was the same as context, so we check if they are different + if (loaderContext.rootContext !== loaderContext.context) { + return loaderContext.rootContext; + } + return undefined; +} - return !!(compiler as RspackCompiler).options.experiments?.parallelLoader; +function safelyResolve(path: string, from: string): string | null { + try { + return require.resolve(path, { paths: [from] }); + } catch { + return null; + } } + +async function getSwcModule(loaderContext: LoaderContext): Promise { + const projectRoot = getProjectRootPath(loaderContext) ?? process.cwd(); + const isWebpack = isWebpackBackend(loaderContext); + if (!isWebpack) { + // happy path - rspack & exposed swc + if (loaderContext._compiler.rspack.experiments.swc) { + console.log('using exposed swc from `@rspack/core`'); + return loaderContext._compiler.rspack.experiments.swc; + } + // fallback to checking for `@rspack/core` installed in the project + const rspackCorePath = safelyResolve('@rspack/core', projectRoot); + if (rspackCorePath && !isWebpack) { + const rspack = await import(rspackCorePath); + if (rspack) console.log('using swc from `@rspack/core`'); + if ('default' in rspack) return rspack.default.experiments.swc; + if (rspack) return rspack.experiments.swc; + } + } + // fallback to checking for `@swc/core` installed in the project + // this can be in both webpack & rspack projects + const swcCorePath = safelyResolve('@swc/core', projectRoot); + if (swcCorePath) { + const swc = await import(swcCorePath); + if (swc) console.log('using swc from`@swc/core`'); + if ('default' in swc) return swc.default as Swc; + if (swc) return swc as Swc; + } + // at this point, we've tried all possible ways to get swc and failed + return null; +} + +function createLazyGetSwc(): ( + loaderContext: LoaderContext +) => Promise { + let swc: Swc | Promise | null | undefined; + const getSwc = async (loaderContext: LoaderContext) => { + if (swc === undefined) { + swc = getSwcModule(loaderContext); + } + return await swc; + }; + return getSwc; +} + +export const lazyGetSwc = createLazyGetSwc(); From 95b534dcb90d3371885b1fc9821892c4169ec97d Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 6 Aug 2025 16:31:49 +0200 Subject: [PATCH 38/61] chore: use threaded-loader in tester-app --- apps/tester-app/package.json | 2 ++ apps/tester-app/webpack.config.mjs | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/tester-app/package.json b/apps/tester-app/package.json index 799629896..91847d936 100644 --- a/apps/tester-app/package.json +++ b/apps/tester-app/package.json @@ -45,6 +45,7 @@ "@rsdoctor/rspack-plugin": "^0.4.11", "@rspack/core": "catalog:", "@svgr/webpack": "^8.1.0", + "@swc/core": "^1.13.3", "@swc/helpers": "catalog:", "@types/jest": "^29.5.13", "@types/react": "catalog:testers", @@ -57,6 +58,7 @@ "react-native-test-app": "catalog:testers", "tailwindcss": "^3.4.17", "terser-webpack-plugin": "catalog:", + "thread-loader": "^4.0.4", "typescript": "catalog:", "vitest": "catalog:", "webpack": "catalog:" diff --git a/apps/tester-app/webpack.config.mjs b/apps/tester-app/webpack.config.mjs index ccef59a74..28ff2d6d9 100644 --- a/apps/tester-app/webpack.config.mjs +++ b/apps/tester-app/webpack.config.mjs @@ -51,7 +51,7 @@ export default Repack.defineWebpackConfig((env) => { rules: [ { test: /\.[cm]?[jt]sx?$/, - use: '@callstack/repack/babel-swc-loader', + use: ['thread-loader', '@callstack/repack/babel-swc-loader'], type: 'javascript/auto', }, { From 942ae61e1507ce06052ad8f12d034952975d0808 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 6 Aug 2025 16:34:22 +0200 Subject: [PATCH 39/61] chore: bump rspack/core & update lockfile --- pnpm-lock.yaml | 686 ++++++++++++++++++++++++++++++++++++++------ pnpm-workspace.yaml | 2 +- 2 files changed, 593 insertions(+), 95 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ace041122..b63cf9b1f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,8 @@ catalogs: specifier: ^0.6.3 version: 0.6.3 '@rspack/core': - specifier: ^1.4.2 - version: 1.4.6 + specifier: ^1.4.11 + version: 1.4.11 '@swc/helpers': specifier: ~0.5.17 version: 0.5.17 @@ -101,7 +101,7 @@ importers: version: 1.0.0 nx: specifier: 19.7.3 - version: 19.7.3 + version: 19.7.3(@swc/core@1.13.3) typescript: specifier: 'catalog:' version: 5.8.3 @@ -180,13 +180,16 @@ importers: version: 0.80.0 '@rsdoctor/rspack-plugin': specifier: ^0.4.11 - version: 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) + version: 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) '@rspack/core': specifier: 'catalog:' - version: 1.4.6(@swc/helpers@0.5.17) + version: 1.4.11(@swc/helpers@0.5.17) '@svgr/webpack': specifier: ^8.1.0 version: 8.1.0(typescript@5.8.3) + '@swc/core': + specifier: ^1.13.3 + version: 1.13.3(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -213,7 +216,7 @@ importers: version: 8.5.1 postcss-loader: specifier: ^8.1.1 - version: 8.1.1(@rspack/core@1.4.6(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.100.2) + version: 8.1.1(@rspack/core@1.4.11(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) react-native-test-app: specifier: catalog:testers version: 4.4.5(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) @@ -222,7 +225,10 @@ importers: version: 3.4.17 terser-webpack-plugin: specifier: 'catalog:' - version: 5.3.14(webpack@5.100.2) + version: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + thread-loader: + specifier: ^4.0.4 + version: 4.0.4(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) typescript: specifier: 'catalog:' version: 5.8.3 @@ -231,7 +237,7 @@ importers: version: 2.0.5(@types/node@20.14.11)(lightningcss@1.28.2)(terser@5.31.3) webpack: specifier: 'catalog:' - version: 5.100.2 + version: 5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)) apps/tester-federation: dependencies: @@ -280,10 +286,10 @@ importers: version: 0.80.0 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) + version: 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) '@rspack/core': specifier: 'catalog:' - version: 1.4.6(@swc/helpers@0.5.17) + version: 1.4.11(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -298,13 +304,13 @@ importers: version: 4.4.5(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) terser-webpack-plugin: specifier: 'catalog:' - version: 5.3.14(webpack@5.100.2) + version: 5.3.14(@swc/core@1.13.3)(webpack@5.100.2(@swc/core@1.13.3)) typescript: specifier: 'catalog:' version: 5.8.3 webpack: specifier: 'catalog:' - version: 5.100.2 + version: 5.100.2(@swc/core@1.13.3) apps/tester-federation-v2: dependencies: @@ -313,7 +319,7 @@ importers: version: link:../../packages/repack '@module-federation/enhanced': specifier: 0.12.0 - version: 0.12.0(@rspack/core@1.4.6(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2) + version: 0.12.0(@rspack/core@1.4.11(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.3)) '@module-federation/runtime': specifier: 0.12.0 version: 0.12.0 @@ -359,10 +365,10 @@ importers: version: 0.80.0 '@rsdoctor/rspack-plugin': specifier: ^0.4.5 - version: 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) + version: 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) '@rspack/core': specifier: 'catalog:' - version: 1.4.6(@swc/helpers@0.5.17) + version: 1.4.11(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -377,13 +383,13 @@ importers: version: 4.4.5(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0) terser-webpack-plugin: specifier: 'catalog:' - version: 5.3.14(webpack@5.100.2) + version: 5.3.14(@swc/core@1.13.3)(webpack@5.100.2(@swc/core@1.13.3)) typescript: specifier: 'catalog:' version: 5.8.3 webpack: specifier: 'catalog:' - version: 5.100.2 + version: 5.100.2(@swc/core@1.13.3) packages/dev-server: dependencies: @@ -502,13 +508,13 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.4.6(@swc/helpers@0.5.17) + version: 1.4.11(@swc/helpers@0.5.17) '@types/node': specifier: 'catalog:' version: 20.14.11 webpack: specifier: 'catalog:' - version: 5.100.2 + version: 5.100.2(@swc/core@1.13.3) packages/plugin-nativewind: dependencies: @@ -521,7 +527,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.4.6(@swc/helpers@0.5.17) + version: 1.4.11(@swc/helpers@0.5.17) '@types/dedent': specifier: 0.7.2 version: 0.7.2 @@ -536,7 +542,7 @@ importers: version: 0.1.22(react-native-reanimated@4.0.0(@babel/core@7.25.2)(react-native-worklets@0.4.0(@babel/core@7.25.2)(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native-safe-area-context@5.5.0(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native-svg@15.12.0(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0))(react-native@0.80.0(@babel/core@7.25.2)(@react-native-community/cli@19.0.0(typescript@5.8.3))(@types/react@19.1.8)(react@19.1.0))(react@19.1.0)(tailwindcss@3.4.17) webpack: specifier: 'catalog:' - version: 5.100.2 + version: 5.100.2(@swc/core@1.13.3) packages/plugin-reanimated: dependencies: @@ -549,7 +555,7 @@ importers: version: link:../repack '@rspack/core': specifier: 'catalog:' - version: 1.4.6(@swc/helpers@0.5.17) + version: 1.4.11(@swc/helpers@0.5.17) '@types/babel__core': specifier: 7.20.5 version: 7.20.5 @@ -561,7 +567,7 @@ importers: version: 7.7.0 webpack: specifier: 'catalog:' - version: 5.100.2 + version: 5.100.2(@swc/core@1.13.3) packages/repack: dependencies: @@ -576,7 +582,7 @@ importers: version: 1.0.0(react-refresh@0.14.2) babel-loader: specifier: ^9.2.1 - version: 9.2.1(@babel/core@7.25.2)(webpack@5.100.2) + version: 9.2.1(@babel/core@7.25.2)(webpack@5.100.2(@swc/core@1.13.3)) colorette: specifier: ^2.0.20 version: 2.0.20 @@ -633,7 +639,7 @@ importers: version: 2.2.1 terser-webpack-plugin: specifier: ^5.3.14 - version: 5.3.14(webpack@5.100.2) + version: 5.3.14(@swc/core@1.13.3)(webpack@5.100.2(@swc/core@1.13.3)) throttleit: specifier: ^2.1.0 version: 2.1.0 @@ -655,13 +661,13 @@ importers: version: 7.24.8(@babel/core@7.25.2) '@module-federation/enhanced': specifier: 0.8.9 - version: 0.8.9(@rspack/core@1.4.6(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2) + version: 0.8.9(@rspack/core@1.4.11(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.3)) '@module-federation/sdk': specifier: 0.6.10 version: 0.6.10 '@rspack/core': specifier: 'catalog:' - version: 1.4.6(@swc/helpers@0.5.17) + version: 1.4.11(@swc/helpers@0.5.17) '@swc/helpers': specifier: 'catalog:' version: 0.5.17 @@ -715,7 +721,7 @@ importers: version: 5.8.3 webpack: specifier: 'catalog:' - version: 5.100.2 + version: 5.100.2(@swc/core@1.13.3) tests/metro-compat: devDependencies: @@ -775,22 +781,22 @@ importers: dependencies: '@callstack/rspress-theme': specifier: ^0.3.1 - version: 0.3.1(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2)) + version: 0.3.1(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))) '@rspress/plugin-llms': specifier: 2.0.0-beta.21 - version: 2.0.0-beta.21(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2)) + version: 2.0.0-beta.21(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))) rsbuild-plugin-open-graph: specifier: ^1.0.2 version: 1.0.2(@rsbuild/core@1.4.6) rspress: specifier: 2.0.0-beta.21 - version: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2) + version: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)) rspress-plugin-sitemap: specifier: ^1.1.1 version: 1.1.1 rspress-plugin-vercel-analytics: specifier: ^0.3.0 - version: 0.3.0(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2)) + version: 0.3.0(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))) devDependencies: '@types/node': specifier: 'catalog:' @@ -1699,12 +1705,21 @@ packages: '@emnapi/core@1.4.3': resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/wasi-threads@1.0.2': resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} @@ -2257,6 +2272,9 @@ packages: '@module-federation/error-codes@0.15.0': resolution: {integrity: sha512-CFJSF+XKwTcy0PFZ2l/fSUpR4z247+Uwzp1sXVkdIfJ/ATsnqf0Q01f51qqSEA6MYdQi6FKos9FIcu3dCpQNdg==} + '@module-federation/error-codes@0.17.1': + resolution: {integrity: sha512-n6Elm4qKSjwAPxLUGtwnl7qt4y1dxB8OpSgVvXBIzqI9p27a3ZXshLPLnumlpPg1Qudaj8sLnSnFtt9yGpt5yQ==} + '@module-federation/error-codes@0.8.4': resolution: {integrity: sha512-55LYmrDdKb4jt+qr8qE8U3al62ZANp3FhfVaNPOaAmdTh0jHdD8M3yf5HKFlr5xVkVO4eV/F/J2NCfpbh+pEXQ==} @@ -2318,6 +2336,9 @@ packages: '@module-federation/runtime-core@0.15.0': resolution: {integrity: sha512-RYzI61fRDrhyhaEOXH3AgIGlHiot0wPFXu7F43cr+ZnTi+VlSYWLdlZ4NBuT9uV6JSmH54/c+tEZm5SXgKR2sQ==} + '@module-federation/runtime-core@0.17.1': + resolution: {integrity: sha512-LCtIFuKgWPQ3E+13OyrVpuTPOWBMI/Ggwsq1Q874YeT8Px28b8tJRCj09DjyRFyhpSPyV/uG80T6iXPAUoLIfQ==} + '@module-federation/runtime-core@0.6.17': resolution: {integrity: sha512-PXFN/TT9f64Un6NQYqH1Z0QLhpytW15jkZvTEOV8W7Ed319BECFI0Rv4xAsAGa8zJGFoaM/c7QOQfdFXtKj5Og==} @@ -2330,6 +2351,9 @@ packages: '@module-federation/runtime-tools@0.15.0': resolution: {integrity: sha512-kzFn3ObUeBp5vaEtN1WMxhTYBuYEErxugu1RzFUERD21X3BZ+b4cWwdFJuBDlsmVjctIg/QSOoZoPXRKAO0foA==} + '@module-federation/runtime-tools@0.17.1': + resolution: {integrity: sha512-4kr6zTFFwGywJx6whBtxsc84V+COAuuBpEdEbPZN//YLXhNB0iz2IGsy9r9wDl+06h84bD+3dQ05l9euRLgXzQ==} + '@module-federation/runtime-tools@0.8.4': resolution: {integrity: sha512-fjVOsItJ1u5YY6E9FnS56UDwZgqEQUrWFnouRiPtK123LUuqUI9FH4redZoKWlE1PB0ir1Z3tnqy8eFYzPO38Q==} @@ -2345,6 +2369,9 @@ packages: '@module-federation/runtime@0.15.0': resolution: {integrity: sha512-dTPsCNum9Bhu3yPOcrPYq0YnM9eCMMMNB1wuiqf1+sFbQlNApF0vfZxooqz3ln0/MpgE0jerVvFsLVGfqvC9Ug==} + '@module-federation/runtime@0.17.1': + resolution: {integrity: sha512-vKEN32MvUbpeuB/s6UXfkHDZ9N5jFyDDJnj83UTJ8n4N1jHIJu9VZ6Yi4/Ac8cfdvU8UIK9bIbfVXWbUYZUDsw==} + '@module-federation/runtime@0.8.4': resolution: {integrity: sha512-yZeZ7z2Rx4gv/0E97oLTF3V6N25vglmwXGgoeju/W2YjsFvWzVtCDI7zRRb0mJhU6+jmSM8jP1DeQGbea/AiZQ==} @@ -2360,6 +2387,9 @@ packages: '@module-federation/sdk@0.15.0': resolution: {integrity: sha512-PWiYbGcJrKUD6JZiEPihrXhV3bgXdll4bV7rU+opV7tHaun+Z0CdcawjZ82Xnpb8MCPGmqHwa1MPFeUs66zksw==} + '@module-federation/sdk@0.17.1': + resolution: {integrity: sha512-nlUcN6UTEi+3HWF+k8wPy7gH0yUOmCT+xNatihkIVR9REAnr7BUvHFGlPJmx7WEbLPL46+zJUbtQHvLzXwFhng==} + '@module-federation/sdk@0.6.10': resolution: {integrity: sha512-i6ofHnImB4zCn/bt7Ft0zh9o/PxvsJj8Wc88EAeJg4IrY6+bzwwo1G2h44w1Yt3go4skZZFQCK0UxoaV6l/t/A==} @@ -2384,6 +2414,9 @@ packages: '@module-federation/webpack-bundler-runtime@0.15.0': resolution: {integrity: sha512-i+3wu2Ljh2TmuUpsnjwZVupOVqV50jP0ndA8PSP4gwMKlgdGeaZ4VH5KkHAXGr2eiYUxYLMrJXz1+eILJqeGDg==} + '@module-federation/webpack-bundler-runtime@0.17.1': + resolution: {integrity: sha512-Swspdgf4PzcbvS9SNKFlBzfq8h/Qxwqjq/xRSqw1pqAZWondZQzwTTqPXhgrg0bFlz7qWjBS/6a8KuH/gRvGaQ==} + '@module-federation/webpack-bundler-runtime@0.8.4': resolution: {integrity: sha512-HggROJhvHPUX7uqBD/XlajGygMNM1DG0+4OAkk8MBQe4a18QzrRNzZt6XQbRTSG4OaEoyRWhQHvYD3Yps405tQ==} @@ -2396,6 +2429,9 @@ packages: '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + '@napi-rs/wasm-runtime@1.0.1': + resolution: {integrity: sha512-KVlQ/jgywZpixGCKMNwxStmmbYEMyokZpCf2YuIChhfJA2uqfAKNEM8INz7zzTo55iEXfBhIIs3VqYyqzDLj8g==} + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==} @@ -2817,6 +2853,11 @@ packages: cpu: [arm64] os: [darwin] + '@rspack/binding-darwin-arm64@file:../rspack/npm/darwin-arm64': + resolution: {directory: ../rspack/npm/darwin-arm64, type: directory} + cpu: [arm64] + os: [darwin] + '@rspack/binding-darwin-x64@1.2.2': resolution: {integrity: sha512-vG5s7FkEvwrGLfksyDRHwKAHUkhZt1zHZZXJQn4gZKjTBonje8ezdc7IFlDiWpC4S+oBYp73nDWkUzkGRbSdcQ==} cpu: [x64] @@ -2842,6 +2883,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-gnu@1.4.11': + resolution: {integrity: sha512-ms6uwECUIcu+6e82C5HJhRMHnfsI+l33v7XQezntzRPN0+sG3EpikEoT7SGbgt4vDwaWLR7wS20suN4qd5r3GA==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-arm64-gnu@1.4.6': resolution: {integrity: sha512-ZrrCn5b037ImZfZ3MShJrRw4d5M3Tq2rFJupr+SGMg7GTl2T6xEmo3ER/evHlT6e0ETi6tRWPxC9A1125jbSQA==} cpu: [arm64] @@ -2857,6 +2903,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-musl@1.4.11': + resolution: {integrity: sha512-9evq0DOdxMN/H8VM8ZmyY9NSuBgILNVV6ydBfVPMHPx4r1E7JZGpWeKDegZcS5Erw3sS9kVSIxyX78L5PDzzKw==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-arm64-musl@1.4.6': resolution: {integrity: sha512-0a30oR6ZmZrqmsOHQYrbZPCxAgnqAiqlbFozdhHs+Yu2bS7SDiLpdjMg0PHwLZT2+siiMWsLodFZlXRJE54oAQ==} cpu: [arm64] @@ -2872,6 +2923,11 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-gnu@1.4.11': + resolution: {integrity: sha512-bHYFLxPPYBOSaHdQbEoCYGMQ1gOrEWj7Mro/DLfSHZi1a0okcQ2Q1y0i1DczReim3ZhLGNrK7k1IpFXCRbAobQ==} + cpu: [x64] + os: [linux] + '@rspack/binding-linux-x64-gnu@1.4.6': resolution: {integrity: sha512-u6pq1aq7bX+NABVDDTOzH64KMj1KJn8fUWO+FaX7Kr7PBjhmxNRs4OaWZjbXEY6COhMYEJZ04h4DhY+lRzcKjA==} cpu: [x64] @@ -2887,11 +2943,20 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-musl@1.4.11': + resolution: {integrity: sha512-wrm4E7q2k4+cwT6Uhp6hIQ3eUe/YoaUttj6j5TqHYZX6YeLrNPtD9+ne6lQQ17BV8wmm6NZsmoFIJ5xIptpRhQ==} + cpu: [x64] + os: [linux] + '@rspack/binding-linux-x64-musl@1.4.6': resolution: {integrity: sha512-rjP/1dWKB828kzd4/QpDYNVasUAKDj0OeRJGh5L/RluSH3pEqhxm5FwvndpmFDv6m3iPekZ4IO26UrpGJmE9fw==} cpu: [x64] os: [linux] + '@rspack/binding-wasm32-wasi@1.4.11': + resolution: {integrity: sha512-hiYxHZjaZ17wQtXyLCK0IdtOvMWreGVTiGsaHCxyeT+SldDG+r16bXNjmlqfZsjlfl1mkAqKz1dg+mMX28OTqw==} + cpu: [wasm32] + '@rspack/binding-wasm32-wasi@1.4.6': resolution: {integrity: sha512-5M0g7TaWgCFQJr4NKYW2bTLbQJuAQIgZL7WmiDwotgscBJDQWJVBayFEsnM6PYX1Inmu6RNhQ44BKIYwwoSyYw==} cpu: [wasm32] @@ -2906,6 +2971,11 @@ packages: cpu: [arm64] os: [win32] + '@rspack/binding-win32-arm64-msvc@1.4.11': + resolution: {integrity: sha512-+HF/mnjmTr8PC1dccRt1bkrD2tPDGeqvXC1BBLYd/Klq1VbtIcnrhfmvQM6KaXbiLcY9VWKzcZPOTmnyZ8TaHQ==} + cpu: [arm64] + os: [win32] + '@rspack/binding-win32-arm64-msvc@1.4.6': resolution: {integrity: sha512-thPCdbh4O+uEAJ8AvXBWZIOW0ZopJAN3CX2zlprso8Cnhi4wDseTtrIxFQh7cTo6pR3xSZAIv/zHd+MMF8TImA==} cpu: [arm64] @@ -2921,6 +2991,11 @@ packages: cpu: [ia32] os: [win32] + '@rspack/binding-win32-ia32-msvc@1.4.11': + resolution: {integrity: sha512-EU2fQGwrRfwFd/tcOInlD0jy6gNQE4Q3Ayj0Is+cX77sbhPPyyOz0kZDEaQ4qaN2VU8w4Hu/rrD7c0GAKLFvCw==} + cpu: [ia32] + os: [win32] + '@rspack/binding-win32-ia32-msvc@1.4.6': resolution: {integrity: sha512-KQmm6c/ZfJKQ/TpzbY6J0pDvUB9kwTXzp+xl2FhGq2RXid8uyDS8ZqbeJA6LDxgttsmp4PRVJjMdLVYjZenfLw==} cpu: [ia32] @@ -2936,6 +3011,11 @@ packages: cpu: [x64] os: [win32] + '@rspack/binding-win32-x64-msvc@1.4.11': + resolution: {integrity: sha512-1Nc5ZzWqfvE+iJc47qtHFzYYnHsC3awavXrCo74GdGip1vxtksM3G30BlvAQHHVtEmULotWqPbjZpflw/Xk9Ag==} + cpu: [x64] + os: [win32] + '@rspack/binding-win32-x64-msvc@1.4.6': resolution: {integrity: sha512-WRRhCsJ+xcOmvzo/r/b2UTejPLnDEbaD/te1yQwHe97sUaFGr3u1Njk6lVYRTV6mEvUopEChb8yAq/S4dvaGLg==} cpu: [x64] @@ -2947,6 +3027,9 @@ packages: '@rspack/binding@1.3.3': resolution: {integrity: sha512-zdwJ801tyC8k+Gu5RjNoc7bEtX0MgJzzVv9qpaMwcAUfUfwZgCzXPTqcGMDoNI+Z47Fw59/2fKCmgZhZn60AgA==} + '@rspack/binding@1.4.11': + resolution: {integrity: sha512-maGl/zRwnl0QVwkBCkgjn5PH20L9HdlRIdkYhEsfTepy5x2QZ0ti/0T49djjTJQrqb+S1i6wWQymMMMMMsxx6Q==} + '@rspack/binding@1.4.6': resolution: {integrity: sha512-rRc6sbKWxhomxxJeqi4QS3S/2T6pKf4JwC/VHXs7KXw7lHXHa3yxPynmn3xHstL0H6VLaM5xQj87Wh7lQYRAPg==} @@ -2974,6 +3057,15 @@ packages: '@swc/helpers': optional: true + '@rspack/core@1.4.11': + resolution: {integrity: sha512-JtKnL6p7Kc/YgWQJF3Woo4OccbgKGyT/4187W4dyex8BMkdQcbqCNIdi6dFk02hwQzxpOOxRSBI4hlGRbz7oYQ==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@swc/helpers': + optional: true + '@rspack/core@1.4.6': resolution: {integrity: sha512-/OpJLv7dPEE7x/qCXGecRm9suNxz5w0Dheq2sh0TjTCUHodtMET3T+FlRWznBAlZeNuHLECDp0DWhchgS8BWuA==} engines: {node: '>=16.0.0'} @@ -3216,12 +3308,87 @@ packages: resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} engines: {node: '>=14'} + '@swc/core-darwin-arm64@1.13.3': + resolution: {integrity: sha512-ux0Ws4pSpBTqbDS9GlVP354MekB1DwYlbxXU3VhnDr4GBcCOimpocx62x7cFJkSpEBF8bmX8+/TTCGKh4PbyXw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.13.3': + resolution: {integrity: sha512-p0X6yhxmNUOMZrbeZ3ZNsPige8lSlSe1llllXvpCLkKKxN/k5vZt1sULoq6Nj4eQ7KeHQVm81/+AwKZyf/e0TA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.13.3': + resolution: {integrity: sha512-OmDoiexL2fVWvQTCtoh0xHMyEkZweQAlh4dRyvl8ugqIPEVARSYtaj55TBMUJIP44mSUOJ5tytjzhn2KFxFcBA==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.13.3': + resolution: {integrity: sha512-STfKku3QfnuUj6k3g9ld4vwhtgCGYIFQmsGPPgT9MK/dI3Lwnpe5Gs5t1inoUIoGNP8sIOLlBB4HV4MmBjQuhw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.13.3': + resolution: {integrity: sha512-bc+CXYlFc1t8pv9yZJGus372ldzOVscBl7encUBlU1m/Sig0+NDJLz6cXXRcFyl6ABNOApWeR4Yl7iUWx6C8og==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.13.3': + resolution: {integrity: sha512-dFXoa0TEhohrKcxn/54YKs1iwNeW6tUkHJgXW33H381SvjKFUV53WR231jh1sWVJETjA3vsAwxKwR23s7UCmUA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.13.3': + resolution: {integrity: sha512-ieyjisLB+ldexiE/yD8uomaZuZIbTc8tjquYln9Quh5ykOBY7LpJJYBWvWtm1g3pHv6AXlBI8Jay7Fffb6aLfA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.13.3': + resolution: {integrity: sha512-elTQpnaX5vESSbhCEgcwXjpMsnUbqqHfEpB7ewpkAsLzKEXZaK67ihSRYAuAx6ewRQTo7DS5iTT6X5aQD3MzMw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.13.3': + resolution: {integrity: sha512-nvehQVEOdI1BleJpuUgPLrclJ0TzbEMc+MarXDmmiRFwEUGqj+pnfkTSb7RZyS1puU74IXdK/YhTirHurtbI9w==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.13.3': + resolution: {integrity: sha512-A+JSKGkRbPLVV2Kwx8TaDAV0yXIXm/gc8m98hSkVDGlPBBmydgzNdWy3X7HTUBM7IDk7YlWE7w2+RUGjdgpTmg==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.13.3': + resolution: {integrity: sha512-ZaDETVWnm6FE0fc+c2UE8MHYVS3Fe91o5vkmGfgwGXFbxYvAjKSqxM/j4cRc9T7VZNSJjriXq58XkfCp3Y6f+w==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '>=0.5.17' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + '@swc/helpers@0.5.13': resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} '@swc/helpers@0.5.17': resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + '@swc/types@0.1.24': + resolution: {integrity: sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==} + '@trysound/sax@0.2.0': resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} @@ -3229,6 +3396,9 @@ packages: '@ts-morph/common@0.23.0': resolution: {integrity: sha512-m7Lllj9n/S6sOkCkRftpM7L24uvmfXQFedlW/4hENcuJH1HHm9u5EgxZb9uVjQSCGrbBWBkOGgcTxNg36r6ywA==} + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} + '@tybys/wasm-util@0.9.0': resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} @@ -7554,6 +7724,12 @@ packages: peerDependencies: tslib: ^2 + thread-loader@4.0.4: + resolution: {integrity: sha512-tXagu6Hivd03wB2tiS1bqvw345sc7mKei32EgpYpq31ZLes9FN0mEK2nKzXLRFgwt3PsBB0E/MZDp159rDoqwg==} + engines: {node: '>= 16.10.0'} + peerDependencies: + webpack: ^5.0.0 + thread-stream@3.1.0: resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} @@ -9116,10 +9292,10 @@ snapshots: '@biomejs/cli-win32-x64@1.9.4': optional: true - '@callstack/rspress-theme@0.3.1(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2))': + '@callstack/rspress-theme@0.3.1(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)))': dependencies: react: 19.1.0 - rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2) + rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)) '@changesets/apply-release-plan@7.0.12': dependencies: @@ -9298,14 +9474,30 @@ snapshots: '@emnapi/wasi-threads': 1.0.2 tslib: 2.8.1 + '@emnapi/core@1.4.5': + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.8.1 + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.0.2': dependencies: tslib: 2.8.1 + '@emnapi/wasi-threads@1.0.4': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.21.5': optional: true @@ -9745,12 +9937,12 @@ snapshots: jju: 1.4.0 js-yaml: 4.1.0 - '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.100.2)': + '@mdx-js/loader@3.1.0(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))': dependencies: '@mdx-js/mdx': 3.1.0(acorn@8.15.0) source-map: 0.7.4 optionalDependencies: - webpack: 5.100.2 + webpack: 5.100.2(@swc/core@1.13.3) transitivePeerDependencies: - acorn - supports-color @@ -9903,7 +10095,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.12.0(@rspack/core@1.4.6(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2)': + '@module-federation/enhanced@0.12.0(@rspack/core@1.4.11(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.3))': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/cli': 0.12.0(typescript@5.8.3) @@ -9913,7 +10105,7 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.12.0(@module-federation/runtime-tools@0.12.0) '@module-federation/managers': 0.12.0 '@module-federation/manifest': 0.12.0(typescript@5.8.3) - '@module-federation/rspack': 0.12.0(@rspack/core@1.4.6(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.12.0(@rspack/core@1.4.11(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 btoa: 1.2.1 @@ -9921,7 +10113,7 @@ snapshots: upath: 2.0.1 optionalDependencies: typescript: 5.8.3 - webpack: 5.100.2 + webpack: 5.100.2(@swc/core@1.13.3) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -9931,7 +10123,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/enhanced@0.8.9(@rspack/core@1.4.6(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2)': + '@module-federation/enhanced@0.8.9(@rspack/core@1.4.11(@swc/helpers@0.5.17))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.3))': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/data-prefetch': 0.8.9(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -9940,14 +10132,14 @@ snapshots: '@module-federation/inject-external-runtime-core-plugin': 0.8.9(@module-federation/runtime-tools@0.8.9) '@module-federation/managers': 0.8.9 '@module-federation/manifest': 0.8.9(typescript@5.8.3) - '@module-federation/rspack': 0.8.9(@rspack/core@1.4.6(@swc/helpers@0.5.17))(typescript@5.8.3) + '@module-federation/rspack': 0.8.9(@rspack/core@1.4.11(@swc/helpers@0.5.17))(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 btoa: 1.2.1 upath: 2.0.1 optionalDependencies: typescript: 5.8.3 - webpack: 5.100.2 + webpack: 5.100.2(@swc/core@1.13.3) transitivePeerDependencies: - '@rspack/core' - bufferutil @@ -9963,6 +10155,8 @@ snapshots: '@module-federation/error-codes@0.15.0': {} + '@module-federation/error-codes@0.17.1': {} + '@module-federation/error-codes@0.8.4': {} '@module-federation/error-codes@0.8.9': {} @@ -10017,7 +10211,7 @@ snapshots: - utf-8-validate - vue-tsc - '@module-federation/rspack@0.12.0(@rspack/core@1.4.6(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.12.0(@rspack/core@1.4.11(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.12.0 '@module-federation/dts-plugin': 0.12.0(typescript@5.8.3) @@ -10026,7 +10220,7 @@ snapshots: '@module-federation/manifest': 0.12.0(typescript@5.8.3) '@module-federation/runtime-tools': 0.12.0 '@module-federation/sdk': 0.12.0 - '@rspack/core': 1.4.6(@swc/helpers@0.5.17) + '@rspack/core': 1.4.11(@swc/helpers@0.5.17) btoa: 1.2.1 optionalDependencies: typescript: 5.8.3 @@ -10036,7 +10230,7 @@ snapshots: - supports-color - utf-8-validate - '@module-federation/rspack@0.8.9(@rspack/core@1.4.6(@swc/helpers@0.5.17))(typescript@5.8.3)': + '@module-federation/rspack@0.8.9(@rspack/core@1.4.11(@swc/helpers@0.5.17))(typescript@5.8.3)': dependencies: '@module-federation/bridge-react-webpack-plugin': 0.8.9 '@module-federation/dts-plugin': 0.8.9(typescript@5.8.3) @@ -10045,7 +10239,7 @@ snapshots: '@module-federation/manifest': 0.8.9(typescript@5.8.3) '@module-federation/runtime-tools': 0.8.9 '@module-federation/sdk': 0.8.9 - '@rspack/core': 1.4.6(@swc/helpers@0.5.17) + '@rspack/core': 1.4.11(@swc/helpers@0.5.17) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -10069,6 +10263,11 @@ snapshots: '@module-federation/error-codes': 0.15.0 '@module-federation/sdk': 0.15.0 + '@module-federation/runtime-core@0.17.1': + dependencies: + '@module-federation/error-codes': 0.17.1 + '@module-federation/sdk': 0.17.1 + '@module-federation/runtime-core@0.6.17': dependencies: '@module-federation/error-codes': 0.8.9 @@ -10089,6 +10288,11 @@ snapshots: '@module-federation/runtime': 0.15.0 '@module-federation/webpack-bundler-runtime': 0.15.0 + '@module-federation/runtime-tools@0.17.1': + dependencies: + '@module-federation/runtime': 0.17.1 + '@module-federation/webpack-bundler-runtime': 0.17.1 + '@module-federation/runtime-tools@0.8.4': dependencies: '@module-federation/runtime': 0.8.4 @@ -10117,6 +10321,12 @@ snapshots: '@module-federation/runtime-core': 0.15.0 '@module-federation/sdk': 0.15.0 + '@module-federation/runtime@0.17.1': + dependencies: + '@module-federation/error-codes': 0.17.1 + '@module-federation/runtime-core': 0.17.1 + '@module-federation/sdk': 0.17.1 + '@module-federation/runtime@0.8.4': dependencies: '@module-federation/error-codes': 0.8.4 @@ -10134,6 +10344,8 @@ snapshots: '@module-federation/sdk@0.15.0': {} + '@module-federation/sdk@0.17.1': {} + '@module-federation/sdk@0.6.10': {} '@module-federation/sdk@0.8.4': @@ -10171,6 +10383,11 @@ snapshots: '@module-federation/runtime': 0.15.0 '@module-federation/sdk': 0.15.0 + '@module-federation/webpack-bundler-runtime@0.17.1': + dependencies: + '@module-federation/runtime': 0.17.1 + '@module-federation/sdk': 0.17.1 + '@module-federation/webpack-bundler-runtime@0.8.4': dependencies: '@module-federation/runtime': 0.8.4 @@ -10194,6 +10411,13 @@ snapshots: '@emnapi/runtime': 1.4.3 '@tybys/wasm-util': 0.9.0 + '@napi-rs/wasm-runtime@1.0.1': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + '@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3': optional: true @@ -10209,9 +10433,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nrwl/tao@19.7.3': + '@nrwl/tao@19.7.3(@swc/core@1.13.3)': dependencies: - nx: 19.7.3 + nx: 19.7.3(@swc/core@1.13.3) tslib: 2.8.1 transitivePeerDependencies: - '@swc-node/register' @@ -10659,12 +10883,35 @@ snapshots: '@rsdoctor/client@0.4.11': {} - '@rsdoctor/core@0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2)': + '@rsdoctor/core@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + dependencies: + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + axios: 1.8.4 + enhanced-resolve: 5.12.0 + filesize: 10.1.6 + fs-extra: 11.3.0 + lodash: 4.17.21 + path-browserify: 1.0.1 + semver: 7.7.2 + source-map: 0.7.4 + webpack-bundle-analyzer: 4.10.2 + transitivePeerDependencies: + - '@rspack/core' + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + + '@rsdoctor/core@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3))': dependencies: - '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/types': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) axios: 1.8.4 enhanced-resolve: 5.12.0 filesize: 10.1.6 @@ -10682,10 +10929,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2)': + '@rsdoctor/graph@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)))': dependencies: - '@rsdoctor/types': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) lodash: 4.17.21 socket.io: 4.7.2 source-map: 0.7.4 @@ -10696,14 +10943,28 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2)': + '@rsdoctor/graph@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3))': dependencies: - '@rsdoctor/core': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/types': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rspack/core': 1.4.6(@swc/helpers@0.5.17) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + lodash: 4.17.21 + socket.io: 4.7.2 + source-map: 0.7.4 + transitivePeerDependencies: + - '@rspack/core' + - bufferutil + - supports-color + - utf-8-validate + - webpack + + '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + dependencies: + '@rsdoctor/core': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rspack/core': 1.4.11(@swc/helpers@0.5.17) lodash: 4.17.21 transitivePeerDependencies: - bufferutil @@ -10712,12 +10973,53 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2)': + '@rsdoctor/rspack-plugin@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3))': + dependencies: + '@rsdoctor/core': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/sdk': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rspack/core': 1.4.11(@swc/helpers@0.5.17) + lodash: 4.17.21 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + - webpack + + '@rsdoctor/sdk@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + dependencies: + '@rsdoctor/client': 0.4.11 + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@types/fs-extra': 11.0.4 + body-parser: 1.20.3 + cors: 2.8.5 + dayjs: 1.11.13 + fs-extra: 11.3.0 + json-cycle: 1.5.0 + lodash: 4.17.21 + open: 8.4.2 + serve-static: 1.16.2 + socket.io: 4.7.2 + source-map: 0.7.4 + tapable: 2.2.1 + transitivePeerDependencies: + - '@rspack/core' + - bufferutil + - supports-color + - utf-8-validate + - webpack + + '@rsdoctor/sdk@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3))': dependencies: '@rsdoctor/client': 0.4.11 - '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/types': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) - '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) + '@rsdoctor/graph': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) + '@rsdoctor/utils': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -10737,20 +11039,55 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2)': + '@rsdoctor/types@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)))': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 '@types/tapable': 2.2.7 source-map: 0.7.4 - webpack: 5.100.2 + webpack: 5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)) optionalDependencies: - '@rspack/core': 1.4.6(@swc/helpers@0.5.17) + '@rspack/core': 1.4.11(@swc/helpers@0.5.17) + + '@rsdoctor/types@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3))': + dependencies: + '@types/connect': 3.4.38 + '@types/estree': 1.0.5 + '@types/tapable': 2.2.7 + source-map: 0.7.4 + webpack: 5.100.2(@swc/core@1.13.3) + optionalDependencies: + '@rspack/core': 1.4.11(@swc/helpers@0.5.17) + + '@rsdoctor/utils@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)))': + dependencies: + '@babel/code-frame': 7.25.7 + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + '@types/estree': 1.0.5 + acorn: 8.15.0 + acorn-import-assertions: 1.9.0(acorn@8.15.0) + acorn-walk: 8.3.4 + chalk: 4.1.2 + connect: 3.7.0 + deep-eql: 4.1.4 + envinfo: 7.14.0 + filesize: 10.1.6 + fs-extra: 11.3.0 + get-port: 5.1.1 + json-stream-stringify: 3.0.1 + lines-and-columns: 2.0.4 + lodash: 4.17.21 + rslog: 1.2.3 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - '@rspack/core' + - supports-color + - webpack - '@rsdoctor/utils@0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2)': + '@rsdoctor/utils@0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3))': dependencies: '@babel/code-frame': 7.25.7 - '@rsdoctor/types': 0.4.11(@rspack/core@1.4.6(@swc/helpers@0.5.17))(webpack@5.100.2) + '@rsdoctor/types': 0.4.11(@rspack/core@1.4.11(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3)) '@types/estree': 1.0.5 acorn: 8.15.0 acorn-import-assertions: 1.9.0(acorn@8.15.0) @@ -10791,6 +11128,9 @@ snapshots: '@rspack/binding-darwin-arm64@1.4.6': optional: true + '@rspack/binding-darwin-arm64@file:../rspack/npm/darwin-arm64': + optional: true + '@rspack/binding-darwin-x64@1.2.2': optional: true @@ -10806,6 +11146,9 @@ snapshots: '@rspack/binding-linux-arm64-gnu@1.3.3': optional: true + '@rspack/binding-linux-arm64-gnu@1.4.11': + optional: true + '@rspack/binding-linux-arm64-gnu@1.4.6': optional: true @@ -10815,6 +11158,9 @@ snapshots: '@rspack/binding-linux-arm64-musl@1.3.3': optional: true + '@rspack/binding-linux-arm64-musl@1.4.11': + optional: true + '@rspack/binding-linux-arm64-musl@1.4.6': optional: true @@ -10824,6 +11170,9 @@ snapshots: '@rspack/binding-linux-x64-gnu@1.3.3': optional: true + '@rspack/binding-linux-x64-gnu@1.4.11': + optional: true + '@rspack/binding-linux-x64-gnu@1.4.6': optional: true @@ -10833,9 +11182,17 @@ snapshots: '@rspack/binding-linux-x64-musl@1.3.3': optional: true + '@rspack/binding-linux-x64-musl@1.4.11': + optional: true + '@rspack/binding-linux-x64-musl@1.4.6': optional: true + '@rspack/binding-wasm32-wasi@1.4.11': + dependencies: + '@napi-rs/wasm-runtime': 1.0.1 + optional: true + '@rspack/binding-wasm32-wasi@1.4.6': dependencies: '@napi-rs/wasm-runtime': 0.2.11 @@ -10847,6 +11204,9 @@ snapshots: '@rspack/binding-win32-arm64-msvc@1.3.3': optional: true + '@rspack/binding-win32-arm64-msvc@1.4.11': + optional: true + '@rspack/binding-win32-arm64-msvc@1.4.6': optional: true @@ -10856,6 +11216,9 @@ snapshots: '@rspack/binding-win32-ia32-msvc@1.3.3': optional: true + '@rspack/binding-win32-ia32-msvc@1.4.11': + optional: true + '@rspack/binding-win32-ia32-msvc@1.4.6': optional: true @@ -10865,6 +11228,9 @@ snapshots: '@rspack/binding-win32-x64-msvc@1.3.3': optional: true + '@rspack/binding-win32-x64-msvc@1.4.11': + optional: true + '@rspack/binding-win32-x64-msvc@1.4.6': optional: true @@ -10892,6 +11258,18 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 1.3.3 '@rspack/binding-win32-x64-msvc': 1.3.3 + '@rspack/binding@1.4.11': + optionalDependencies: + '@rspack/binding-darwin-arm64': file:../rspack/npm/darwin-arm64 + '@rspack/binding-linux-arm64-gnu': 1.4.11 + '@rspack/binding-linux-arm64-musl': 1.4.11 + '@rspack/binding-linux-x64-gnu': 1.4.11 + '@rspack/binding-linux-x64-musl': 1.4.11 + '@rspack/binding-wasm32-wasi': 1.4.11 + '@rspack/binding-win32-arm64-msvc': 1.4.11 + '@rspack/binding-win32-ia32-msvc': 1.4.11 + '@rspack/binding-win32-x64-msvc': 1.4.11 + '@rspack/binding@1.4.6': optionalDependencies: '@rspack/binding-darwin-arm64': 1.4.6 @@ -10923,6 +11301,14 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.17 + '@rspack/core@1.4.11(@swc/helpers@0.5.17)': + dependencies: + '@module-federation/runtime-tools': 0.17.1 + '@rspack/binding': 1.4.11 + '@rspack/lite-tapable': 1.0.1 + optionalDependencies: + '@swc/helpers': 0.5.17 + '@rspack/core@1.4.6(@swc/helpers@0.5.17)': dependencies: '@module-federation/runtime-tools': 0.15.0 @@ -10946,9 +11332,9 @@ snapshots: html-entities: 2.6.0 react-refresh: 0.17.0 - '@rspress/core@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2)': + '@rspress/core@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))': dependencies: - '@mdx-js/loader': 3.1.0(acorn@8.15.0)(webpack@5.100.2) + '@mdx-js/loader': 3.1.0(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)) '@mdx-js/mdx': 3.1.0(acorn@8.15.0) '@mdx-js/react': 3.1.0(@types/react@18.3.3)(react@19.1.0) '@rsbuild/core': 1.4.6 @@ -11025,12 +11411,12 @@ snapshots: '@rspress/mdx-rs-win32-arm64-msvc': 0.6.6 '@rspress/mdx-rs-win32-x64-msvc': 0.6.6 - '@rspress/plugin-llms@2.0.0-beta.21(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2))': + '@rspress/plugin-llms@2.0.0-beta.21(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)))': dependencies: remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2) + rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)) unified: 11.0.5 unist-util-visit: 5.0.0 unist-util-visit-children: 3.0.0 @@ -11247,6 +11633,55 @@ snapshots: - supports-color - typescript + '@swc/core-darwin-arm64@1.13.3': + optional: true + + '@swc/core-darwin-x64@1.13.3': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.13.3': + optional: true + + '@swc/core-linux-arm64-gnu@1.13.3': + optional: true + + '@swc/core-linux-arm64-musl@1.13.3': + optional: true + + '@swc/core-linux-x64-gnu@1.13.3': + optional: true + + '@swc/core-linux-x64-musl@1.13.3': + optional: true + + '@swc/core-win32-arm64-msvc@1.13.3': + optional: true + + '@swc/core-win32-ia32-msvc@1.13.3': + optional: true + + '@swc/core-win32-x64-msvc@1.13.3': + optional: true + + '@swc/core@1.13.3(@swc/helpers@0.5.17)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.24 + optionalDependencies: + '@swc/core-darwin-arm64': 1.13.3 + '@swc/core-darwin-x64': 1.13.3 + '@swc/core-linux-arm-gnueabihf': 1.13.3 + '@swc/core-linux-arm64-gnu': 1.13.3 + '@swc/core-linux-arm64-musl': 1.13.3 + '@swc/core-linux-x64-gnu': 1.13.3 + '@swc/core-linux-x64-musl': 1.13.3 + '@swc/core-win32-arm64-msvc': 1.13.3 + '@swc/core-win32-ia32-msvc': 1.13.3 + '@swc/core-win32-x64-msvc': 1.13.3 + '@swc/helpers': 0.5.17 + + '@swc/counter@0.1.3': {} + '@swc/helpers@0.5.13': dependencies: tslib: 2.8.1 @@ -11255,6 +11690,10 @@ snapshots: dependencies: tslib: 2.8.1 + '@swc/types@0.1.24': + dependencies: + '@swc/counter': 0.1.3 + '@trysound/sax@0.2.0': {} '@ts-morph/common@0.23.0': @@ -11264,6 +11703,11 @@ snapshots: mkdirp: 3.0.1 path-browserify: 1.0.1 + '@tybys/wasm-util@0.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@tybys/wasm-util@0.9.0': dependencies: tslib: 2.8.1 @@ -11761,12 +12205,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.100.2): + babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.100.2(@swc/core@1.13.3)): dependencies: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.3.0 - webpack: 5.100.2 + webpack: 5.100.2(@swc/core@1.13.3) babel-plugin-istanbul@6.1.1: dependencies: @@ -15208,10 +15652,10 @@ snapshots: nullthrows@1.1.1: {} - nx@19.7.3: + nx@19.7.3(@swc/core@1.13.3): dependencies: '@napi-rs/wasm-runtime': 0.2.4 - '@nrwl/tao': 19.7.3 + '@nrwl/tao': 19.7.3(@swc/core@1.13.3) '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.7 @@ -15256,6 +15700,7 @@ snapshots: '@nx/nx-linux-x64-musl': 19.7.3 '@nx/nx-win32-arm64-msvc': 19.7.3 '@nx/nx-win32-x64-msvc': 19.7.3 + '@swc/core': 1.13.3(@swc/helpers@0.5.17) transitivePeerDependencies: - debug @@ -15551,15 +15996,15 @@ snapshots: optionalDependencies: postcss: 8.5.1 - postcss-loader@8.1.1(@rspack/core@1.4.6(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.100.2): + postcss-loader@8.1.1(@rspack/core@1.4.11(@swc/helpers@0.5.17))(postcss@8.5.1)(typescript@5.8.3)(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))): dependencies: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.7 postcss: 8.5.1 semver: 7.6.3 optionalDependencies: - '@rspack/core': 1.4.6(@swc/helpers@0.5.17) - webpack: 5.100.2 + '@rspack/core': 1.4.11(@swc/helpers@0.5.17) + webpack: 5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)) transitivePeerDependencies: - typescript @@ -16140,7 +16585,7 @@ snapshots: dependencies: fs-extra: 11.3.0 - rspress-plugin-devkit@0.3.0(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2)): + rspress-plugin-devkit@0.3.0(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))): dependencies: '@rspress/shared': 1.42.0 '@types/estree-jsx': 1.0.5 @@ -16155,7 +16600,7 @@ snapshots: mdast-util-to-markdown: 1.5.0 mdast-util-to-string: 4.0.0 remark-mdc: 1.2.0 - rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2) + rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)) ts-morph: 22.0.0 unified: 10.1.2 unist-util-visit: 5.0.0 @@ -16169,22 +16614,22 @@ snapshots: rspress-plugin-sitemap@1.1.1: {} - rspress-plugin-vercel-analytics@0.3.0(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2)): + rspress-plugin-vercel-analytics@0.3.0(react@19.1.0)(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))): dependencies: '@rspress/shared': 1.42.0 '@vercel/analytics': 1.3.1(react@19.1.0) - rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2) - rspress-plugin-devkit: 0.3.0(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2)) + rspress: 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)) + rspress-plugin-devkit: 0.3.0(rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3))) transitivePeerDependencies: - '@rspack/tracing' - next - react - supports-color - rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2): + rspress@2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)): dependencies: '@rsbuild/core': 1.4.6 - '@rspress/core': 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2) + '@rspress/core': 2.0.0-beta.21(@types/react@18.3.3)(acorn@8.15.0)(webpack@5.100.2(@swc/core@1.13.3)) '@rspress/shared': 2.0.0-beta.21 cac: 6.7.14 chokidar: 3.6.0 @@ -16620,14 +17065,27 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.3.14(webpack@5.100.2): + terser-webpack-plugin@5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.2 + serialize-javascript: 6.0.2 + terser: 5.31.3 + webpack: 5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)) + optionalDependencies: + '@swc/core': 1.13.3(@swc/helpers@0.5.17) + + terser-webpack-plugin@5.3.14(@swc/core@1.13.3)(webpack@5.100.2(@swc/core@1.13.3)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.31.3 - webpack: 5.100.2 + webpack: 5.100.2(@swc/core@1.13.3) + optionalDependencies: + '@swc/core': 1.13.3(@swc/helpers@0.5.17) terser@5.31.3: dependencies: @@ -16654,6 +17112,14 @@ snapshots: dependencies: tslib: 2.8.1 + thread-loader@4.0.4(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))): + dependencies: + json-parse-better-errors: 1.0.2 + loader-runner: 4.3.0 + neo-async: 2.6.2 + schema-utils: 4.3.2 + webpack: 5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)) + thread-stream@3.1.0: dependencies: real-require: 0.2.0 @@ -17051,7 +17517,39 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.100.2: + webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17)): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.2 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.2 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.14(@swc/core@1.13.3(@swc/helpers@0.5.17))(webpack@5.100.2(@swc/core@1.13.3(@swc/helpers@0.5.17))) + watchpack: 2.4.1 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + webpack@5.100.2(@swc/core@1.13.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.8 @@ -17075,7 +17573,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(webpack@5.100.2) + terser-webpack-plugin: 5.3.14(@swc/core@1.13.3)(webpack@5.100.2(@swc/core@1.13.3)) watchpack: 2.4.1 webpack-sources: 3.3.3 transitivePeerDependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 406913c15..592821082 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,7 +5,7 @@ packages: - "website" catalog: - "@rspack/core": ^1.4.2 + "@rspack/core": ^1.4.11 "@rslib/core": ^0.6.3 "@swc/helpers": ~0.5.17 "@types/node": ^20 From 1fefd3ad513ff8abfdccff0766b50d894fecbc44 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 6 Aug 2025 16:39:07 +0200 Subject: [PATCH 40/61] chore: revert changes to isRspackCompiler --- packages/repack/src/plugins/DevelopmentPlugin.ts | 2 +- packages/repack/src/plugins/LoggerPlugin.ts | 4 +++- packages/repack/src/plugins/ModuleFederationPluginV1.ts | 2 +- packages/repack/src/plugins/ModuleFederationPluginV2.ts | 2 +- packages/repack/src/plugins/NativeEntryPlugin.ts | 2 +- .../src/{utils/internal => plugins/utils}/isRspackCompiler.ts | 0 packages/repack/src/utils/internal/index.ts | 1 - 7 files changed, 7 insertions(+), 6 deletions(-) rename packages/repack/src/{utils/internal => plugins/utils}/isRspackCompiler.ts (100%) diff --git a/packages/repack/src/plugins/DevelopmentPlugin.ts b/packages/repack/src/plugins/DevelopmentPlugin.ts index 9ba73370d..df34db0c5 100644 --- a/packages/repack/src/plugins/DevelopmentPlugin.ts +++ b/packages/repack/src/plugins/DevelopmentPlugin.ts @@ -7,7 +7,7 @@ import type { } from '@rspack/core'; import ReactRefreshPlugin from '@rspack/plugin-react-refresh'; import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler } from '../utils/internal/index.js'; +import { isRspackCompiler } from './utils/isRspackCompiler.js'; import { moveElementBefore } from './utils/moveElementBefore.js'; const [reactRefreshEntryPath, reactRefreshPath, refreshUtilsPath] = diff --git a/packages/repack/src/plugins/LoggerPlugin.ts b/packages/repack/src/plugins/LoggerPlugin.ts index 5ce930caf..0fd3682c1 100644 --- a/packages/repack/src/plugins/LoggerPlugin.ts +++ b/packages/repack/src/plugins/LoggerPlugin.ts @@ -90,7 +90,9 @@ export class LoggerPlugin { if (LoggerPlugin.SUPPORTED_TYPES.includes(type)) { return { timestamp: timestamp ?? Date.now(), - issuer: issuer.includes('Loader|') ? issuer.split('|')[0] : issuer, + issuer: issuer.includes('reactNativeAssetsLoader') + ? 'reactNativeAssetsLoader' + : issuer, type: type as LogType, message: args, }; diff --git a/packages/repack/src/plugins/ModuleFederationPluginV1.ts b/packages/repack/src/plugins/ModuleFederationPluginV1.ts index 413aebffa..ad1c664db 100644 --- a/packages/repack/src/plugins/ModuleFederationPluginV1.ts +++ b/packages/repack/src/plugins/ModuleFederationPluginV1.ts @@ -1,7 +1,7 @@ import type { Compiler as RspackCompiler, container } from '@rspack/core'; import type { Compiler as WebpackCompiler } from 'webpack'; import { Federated } from '../utils/federated.js'; -import { isRspackCompiler } from '../utils/internal/index.js'; +import { isRspackCompiler } from './utils/isRspackCompiler.js'; type MFPluginV1 = typeof container.ModuleFederationPluginV1; type MFPluginV1Options = ConstructorParameters[0]; diff --git a/packages/repack/src/plugins/ModuleFederationPluginV2.ts b/packages/repack/src/plugins/ModuleFederationPluginV2.ts index b8f763ee4..07cc2a6fb 100644 --- a/packages/repack/src/plugins/ModuleFederationPluginV2.ts +++ b/packages/repack/src/plugins/ModuleFederationPluginV2.ts @@ -2,7 +2,7 @@ import type { moduleFederationPlugin as MF } from '@module-federation/sdk'; import type { Compiler as RspackCompiler } from '@rspack/core'; import { name as isIdentifier } from 'estree-util-is-identifier-name'; import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler } from '../utils/internal/index.js'; +import { isRspackCompiler } from './utils/isRspackCompiler.js'; type JsModuleDescriptor = { identifier: string; diff --git a/packages/repack/src/plugins/NativeEntryPlugin.ts b/packages/repack/src/plugins/NativeEntryPlugin.ts index 28d1c7b4a..27aaac376 100644 --- a/packages/repack/src/plugins/NativeEntryPlugin.ts +++ b/packages/repack/src/plugins/NativeEntryPlugin.ts @@ -1,7 +1,7 @@ import path from 'node:path'; import type { ResolveAlias, Compiler as RspackCompiler } from '@rspack/core'; import type { Compiler as WebpackCompiler } from 'webpack'; -import { isRspackCompiler } from '../utils/internal/index.js'; +import { isRspackCompiler } from './utils/isRspackCompiler.js'; import { moveElementBefore } from './utils/moveElementBefore.js'; export interface NativeEntryPluginConfig { diff --git a/packages/repack/src/utils/internal/isRspackCompiler.ts b/packages/repack/src/plugins/utils/isRspackCompiler.ts similarity index 100% rename from packages/repack/src/utils/internal/isRspackCompiler.ts rename to packages/repack/src/plugins/utils/isRspackCompiler.ts diff --git a/packages/repack/src/utils/internal/index.ts b/packages/repack/src/utils/internal/index.ts index 6ce0c12ad..e0e0e7079 100644 --- a/packages/repack/src/utils/internal/index.ts +++ b/packages/repack/src/utils/internal/index.ts @@ -1,2 +1 @@ -export * from './isRspackCompiler.js'; export * from './swcConfigHelpers.js'; From 453d12d12a8da45bac34acf07e08b3a1c626dff7 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 6 Aug 2025 16:41:43 +0200 Subject: [PATCH 41/61] chore: remove hermes-parser dependency --- packages/repack/package.json | 1 - pnpm-lock.yaml | 26 ++++++++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/repack/package.json b/packages/repack/package.json index a85321e99..47c8cf8aa 100644 --- a/packages/repack/package.json +++ b/packages/repack/package.json @@ -89,7 +89,6 @@ "exit-hook": "^4.0.0", "flow-remove-types": "^2.277.0", "gradient-string": "^2.0.2", - "hermes-parser": "^0.28.1", "image-size": "^1.1.1", "jsonwebtoken": "^9.0.2", "memfs": "^4.11.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b63cf9b1f..2cbaf851b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -607,9 +607,6 @@ importers: gradient-string: specifier: ^2.0.2 version: 2.0.2 - hermes-parser: - specifier: ^0.28.1 - version: 0.28.1 image-size: specifier: ^1.1.1 version: 1.1.1 @@ -2848,13 +2845,13 @@ packages: cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-arm64@1.4.6': - resolution: {integrity: sha512-K37H8e58eY7zBHGeMVtT7m0Z5XvlNQX7YDuaxlbiA4hZxqeRoS5BMX/YOcDiGdNbSuqv+iG5GSckJ99YUI67Cw==} + '@rspack/binding-darwin-arm64@1.4.11': + resolution: {integrity: sha512-PrmBVhR8MC269jo6uQ+BMy1uwIDx0HAJYLQRQur8gXiehWabUBCRg/d4U9KR7rLzdaSScRyc5JWXR52T7/4MfA==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-arm64@file:../rspack/npm/darwin-arm64': - resolution: {directory: ../rspack/npm/darwin-arm64, type: directory} + '@rspack/binding-darwin-arm64@1.4.6': + resolution: {integrity: sha512-K37H8e58eY7zBHGeMVtT7m0Z5XvlNQX7YDuaxlbiA4hZxqeRoS5BMX/YOcDiGdNbSuqv+iG5GSckJ99YUI67Cw==} cpu: [arm64] os: [darwin] @@ -2868,6 +2865,11 @@ packages: cpu: [x64] os: [darwin] + '@rspack/binding-darwin-x64@1.4.11': + resolution: {integrity: sha512-YIV8Wzy+JY0SoSsVtN4wxFXOjzxxVPnVXNswrrfqVUTPr9jqGOFYUWCGpbt8lcCgfuBFm6zN8HpOsKm1xUNsVA==} + cpu: [x64] + os: [darwin] + '@rspack/binding-darwin-x64@1.4.6': resolution: {integrity: sha512-3p5u9q/Q9MMVe+5XFJ/WiFrzNrrxUjJFR19kB1k/KMcf8ox982xWjnfJuBkET/k7Hn0EZL7L06ym447uIfAVAg==} cpu: [x64] @@ -11125,10 +11127,10 @@ snapshots: '@rspack/binding-darwin-arm64@1.3.3': optional: true - '@rspack/binding-darwin-arm64@1.4.6': + '@rspack/binding-darwin-arm64@1.4.11': optional: true - '@rspack/binding-darwin-arm64@file:../rspack/npm/darwin-arm64': + '@rspack/binding-darwin-arm64@1.4.6': optional: true '@rspack/binding-darwin-x64@1.2.2': @@ -11137,6 +11139,9 @@ snapshots: '@rspack/binding-darwin-x64@1.3.3': optional: true + '@rspack/binding-darwin-x64@1.4.11': + optional: true + '@rspack/binding-darwin-x64@1.4.6': optional: true @@ -11260,7 +11265,8 @@ snapshots: '@rspack/binding@1.4.11': optionalDependencies: - '@rspack/binding-darwin-arm64': file:../rspack/npm/darwin-arm64 + '@rspack/binding-darwin-arm64': 1.4.11 + '@rspack/binding-darwin-x64': 1.4.11 '@rspack/binding-linux-arm64-gnu': 1.4.11 '@rspack/binding-linux-arm64-musl': 1.4.11 '@rspack/binding-linux-x64-gnu': 1.4.11 From 75a6ec4bd00fe58f06a4dbdf444fead355cd48f5 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Wed, 6 Aug 2025 17:15:01 +0200 Subject: [PATCH 42/61] refactor: safer checks & cleanup in loader --- .../loaders/babelSwcLoader/babelSwcLoader.ts | 22 ++------ .../src/loaders/babelSwcLoader/utils.ts | 50 +++++++++++++++---- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index c4d8f8940..beae453ea 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -8,10 +8,10 @@ import { import { transform } from '../babelLoader/index.js'; import type { BabelSwcLoaderOptions } from './options.js'; import { + checkParallelModeAvailable, getProjectBabelConfig, getProjectRootPath, getSwcParserConfig, - isParallelModeAvailable, isTSXSource, isTypeScriptSource, lazyGetSwc, @@ -75,17 +75,6 @@ function partitionTransforms( return { includedSwcTransforms, supportedSwcTransforms, swcConfig }; } -const disabledParalleModeWarning = [ - 'You have enabled `experiments.parallelLoader` but forgot to enable it for this loader.', - 'To enable parallel mode for this loader you need to add `parallel: true` to the loader rule.', - 'See how to do it in the official Rspack docs:', - 'https://rspack.rs/config/experiments#experimentsparallelloader.', - 'If this is intentional, you can disable this warning', - 'by setting `hideParallelModeWarning` in the loader options.', -].join(' '); - -let parallelModeWarningDisplayed = false; - export default async function babelSwcLoader( this: LoaderContext, source: string, @@ -97,13 +86,8 @@ export default async function babelSwcLoader( const logger = this.getLogger('BabelSwcLoader'); const options = this.getOptions(); - if ( - isParallelModeAvailable(this) && - !parallelModeWarningDisplayed && - !options.hideParallelModeWarning - ) { - logger.warn(disabledParalleModeWarning); - parallelModeWarningDisplayed = true; + if (!options.hideParallelModeWarning) { + checkParallelModeAvailable(this, logger); } const inputSourceMap: InputSourceMap = sourceMap diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index 56374b31a..78aff49ad 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -6,6 +6,7 @@ import type { } from '@rspack/core'; type Swc = (typeof experiments)['swc']; +type Logger = ReturnType; export function isTypeScriptSource(fileName: string) { return !!fileName && fileName.endsWith('.ts'); @@ -57,11 +58,31 @@ function isWebpackBackend(loaderContext: LoaderContext) { return false; } -export function isParallelModeAvailable(loaderContext: LoaderContext) { - if (isWebpackBackend(loaderContext)) { - return false; +const disabledParalleModeWarning = [ + 'You have enabled `experiments.parallelLoader` but forgot to enable it for this loader.', + 'To enable parallel mode for this loader you need to add `parallel: true` to the loader rule.', + 'See how to do it in the official Rspack docs:', + 'https://rspack.rs/config/experiments#experimentsparallelloader.', + 'If this is intentional, you can disable this warning', + 'by setting `hideParallelModeWarning` in the loader options.', +].join(' '); + +let parallelModeWarningDisplayed = false; + +export function checkParallelModeAvailable( + loaderContext: LoaderContext, + logger: Logger +) { + // only Rspack supports parallel mode + if (parallelModeWarningDisplayed || isWebpackBackend(loaderContext)) { + return; + } + // in parallel mode compiler.options.experiments are not available + // but since we're already running in parallel mode, we can ignore this check + if (loaderContext._compiler.options?.experiments?.parallelLoader) { + parallelModeWarningDisplayed = true; + logger.warn(disabledParalleModeWarning); } - return !!loaderContext._compiler.options.experiments?.parallelLoader; } export function getProjectRootPath( @@ -88,17 +109,23 @@ async function getSwcModule(loaderContext: LoaderContext): Promise { const isWebpack = isWebpackBackend(loaderContext); if (!isWebpack) { // happy path - rspack & exposed swc - if (loaderContext._compiler.rspack.experiments.swc) { + // use optional chaining to avoid type errors when using parallel loader + if (loaderContext._compiler.rspack?.experiments?.swc) { console.log('using exposed swc from `@rspack/core`'); return loaderContext._compiler.rspack.experiments.swc; } // fallback to checking for `@rspack/core` installed in the project + // use optional chaining to avoid type errors when there is no experiments.swc const rspackCorePath = safelyResolve('@rspack/core', projectRoot); if (rspackCorePath && !isWebpack) { const rspack = await import(rspackCorePath); if (rspack) console.log('using swc from `@rspack/core`'); - if ('default' in rspack) return rspack.default.experiments.swc; - if (rspack) return rspack.experiments.swc; + if ('default' in rspack) { + return rspack.default?.experiments?.swc ?? null; + } + if (rspack) { + return rspack?.experiments?.swc ?? null; + } } } // fallback to checking for `@swc/core` installed in the project @@ -107,8 +134,12 @@ async function getSwcModule(loaderContext: LoaderContext): Promise { if (swcCorePath) { const swc = await import(swcCorePath); if (swc) console.log('using swc from`@swc/core`'); - if ('default' in swc) return swc.default as Swc; - if (swc) return swc as Swc; + if ('default' in swc) { + return swc.default as Swc; + } + if (swc) { + return swc as Swc; + } } // at this point, we've tried all possible ways to get swc and failed return null; @@ -118,6 +149,7 @@ function createLazyGetSwc(): ( loaderContext: LoaderContext ) => Promise { let swc: Swc | Promise | null | undefined; + const getSwc = async (loaderContext: LoaderContext) => { if (swc === undefined) { swc = getSwcModule(loaderContext); From a5730633c26aa43540065ac10c66a0ba204caf52 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 16:20:02 +0200 Subject: [PATCH 43/61] chore: remove console logs --- packages/repack/src/loaders/babelSwcLoader/utils.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index 78aff49ad..4adfb5270 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -111,7 +111,6 @@ async function getSwcModule(loaderContext: LoaderContext): Promise { // happy path - rspack & exposed swc // use optional chaining to avoid type errors when using parallel loader if (loaderContext._compiler.rspack?.experiments?.swc) { - console.log('using exposed swc from `@rspack/core`'); return loaderContext._compiler.rspack.experiments.swc; } // fallback to checking for `@rspack/core` installed in the project @@ -119,7 +118,6 @@ async function getSwcModule(loaderContext: LoaderContext): Promise { const rspackCorePath = safelyResolve('@rspack/core', projectRoot); if (rspackCorePath && !isWebpack) { const rspack = await import(rspackCorePath); - if (rspack) console.log('using swc from `@rspack/core`'); if ('default' in rspack) { return rspack.default?.experiments?.swc ?? null; } @@ -133,7 +131,6 @@ async function getSwcModule(loaderContext: LoaderContext): Promise { const swcCorePath = safelyResolve('@swc/core', projectRoot); if (swcCorePath) { const swc = await import(swcCorePath); - if (swc) console.log('using swc from`@swc/core`'); if ('default' in swc) { return swc.default as Swc; } From be3527541009a79c13607ed04a0fba30e2e36fbe Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 16:46:52 +0200 Subject: [PATCH 44/61] feat: proper error handling in both loaders --- .../src/loaders/babelLoader/babelLoader.ts | 14 +-- .../repack/src/loaders/babelLoader/options.ts | 8 ++ .../loaders/babelSwcLoader/babelSwcLoader.ts | 117 +++++++++--------- .../src/loaders/babelSwcLoader/utils.ts | 2 +- 4 files changed, 73 insertions(+), 68 deletions(-) create mode 100644 packages/repack/src/loaders/babelLoader/options.ts diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 86016e692..670330c3b 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -4,19 +4,12 @@ import { parseSync, transformFromAstSync, } from '@babel/core'; - import type { LoaderContext } from '@rspack/core'; +import type { BabelLoaderOptions, CustomTransformOptions } from './options.js'; import { isTSXSource, isTypeScriptSource, loadHermesParser } from './utils.js'; export const raw = false; -interface BabelLoaderOptions extends TransformOptions {} - -interface CustomTransformOptions extends TransformOptions { - includePlugins?: Array]>; - excludePlugins?: string[]; -} - function buildBabelConfig(options: CustomTransformOptions): TransformOptions { const { includePlugins, excludePlugins, ...otherOptions } = options; @@ -97,14 +90,13 @@ export default async function babelLoader( const options = this.getOptions(); try { - const result = transform(source, { + const result = await transform(source, { sourceMaps: this.sourceMap, ...options, caller: { name: '@callstack/repack/babel-loader' }, filename: this.resourcePath, }); - // @ts-ignore - callback(null, result.code, result.map); + callback(null, result.code ?? undefined, result.map ?? undefined); } catch (e) { callback(e as Error); } diff --git a/packages/repack/src/loaders/babelLoader/options.ts b/packages/repack/src/loaders/babelLoader/options.ts new file mode 100644 index 000000000..99a531d84 --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/options.ts @@ -0,0 +1,8 @@ +import type { TransformOptions } from '@babel/core'; + +export interface BabelLoaderOptions extends TransformOptions {} + +export interface CustomTransformOptions extends TransformOptions { + includePlugins?: Array]>; + excludePlugins?: string[]; +} diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index beae453ea..c40dc13ca 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -111,61 +111,66 @@ export default async function babelSwcLoader( ...options.babelOverrides, }; - const swc = await lazyGetSwc(this); - // if swc is not available, use babel to transform everything - if (!swc) { - const { code, map } = await transform(source, baseBabelConfig); - callback(null, code ?? undefined, map ?? undefined); - return; + try { + const swc = await lazyGetSwc(this); + // if swc is not available, use babel to transform everything + if (!swc) { + const { code, map } = await transform(source, baseBabelConfig); + callback(null, code ?? undefined, map ?? undefined); + return; + } + + const babelConfig = getProjectBabelConfig(projectRoot); + const babelTransforms = + babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? + []; + + const includeBabelPlugins = getExtraBabelPlugins(this.resourcePath); + const { includedSwcTransforms, supportedSwcTransforms, swcConfig } = + partitionTransforms(this.resourcePath, babelTransforms); + + const babelResult = await transform(source, { + ...baseBabelConfig, + excludePlugins: supportedSwcTransforms, + includePlugins: includeBabelPlugins, + }); + + const finalSwcConfig: SwcLoaderOptions = { + ...swcConfig, + // set env based on babel transforms + env: { + // node supports everything and does not include + // any transforms by default, so it can as a template + targets: { node: 24 }, + include: includedSwcTransforms, + }, + // set lazy imports based on loader options + module: { + ...swcConfig.module, + lazy: lazyImports, + type: swcConfig.module!.type, + }, + }; + + const swcResult = swc.transformSync(babelResult?.code!, { + ...finalSwcConfig, + caller: { name: loaderName }, + filename: this.resourcePath, + configFile: false, + swcrc: false, + root: projectRoot ?? babelConfig.root ?? undefined, + minify: false, + sourceMaps: withSourceMaps, + inputSourceMap: withSourceMaps + ? JSON.stringify(babelResult?.map) + : undefined, + sourceFileName: this.resourcePath, + sourceRoot: this.context!, + ...options.swcOverrides, + }); + + callback(null, swcResult?.code, swcResult?.map); + } catch (error) { + callback(error as Error); } - - const babelConfig = getProjectBabelConfig(projectRoot); - const babelTransforms = - babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? []; - - const includeBabelPlugins = getExtraBabelPlugins(this.resourcePath); - const { includedSwcTransforms, supportedSwcTransforms, swcConfig } = - partitionTransforms(this.resourcePath, babelTransforms); - - const babelResult = await transform(source, { - ...baseBabelConfig, - excludePlugins: supportedSwcTransforms, - includePlugins: includeBabelPlugins, - }); - - const finalSwcConfig: SwcLoaderOptions = { - ...swcConfig, - // set env based on babel transforms - env: { - // node supports everything and does not include - // any transforms by default, so it can as a template - targets: { node: 24 }, - include: includedSwcTransforms, - }, - // set lazy imports based on loader options - module: { - ...swcConfig.module, - lazy: lazyImports, - type: swcConfig.module!.type, - }, - }; - - const swcResult = swc.transformSync(babelResult?.code!, { - ...finalSwcConfig, - caller: { name: loaderName }, - filename: this.resourcePath, - configFile: false, - swcrc: false, - root: projectRoot ?? babelConfig.root ?? undefined, - minify: false, - sourceMaps: withSourceMaps, - inputSourceMap: withSourceMaps - ? JSON.stringify(babelResult?.map) - : undefined, - sourceFileName: this.resourcePath, - sourceRoot: this.context!, - ...options.swcOverrides, - }); - - callback(null, swcResult?.code, swcResult?.map); } diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index 4adfb5270..d7824ef03 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -21,7 +21,7 @@ export function isJSXSource(fileName: string) { } export function getProjectBabelConfig(projectRoot?: string) { - const babelConfig = loadOptions({ cwd: projectRoot, root: projectRoot }); + const babelConfig = loadOptions({ root: projectRoot }); return babelConfig ?? {}; } From 57cde01988a214eff7e7e9d36e25e2143499e1be Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 18:10:39 +0200 Subject: [PATCH 45/61] feat: ignore repack deep imports --- .../src/loaders/babelLoader/babelLoader.ts | 24 ++++++++++++------- .../repack/src/loaders/babelLoader/options.ts | 12 +++++++++- .../repack/src/loaders/babelLoader/utils.ts | 13 ++++++++++ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index 670330c3b..e54505320 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -6,7 +6,12 @@ import { } from '@babel/core'; import type { LoaderContext } from '@rspack/core'; import type { BabelLoaderOptions, CustomTransformOptions } from './options.js'; -import { isTSXSource, isTypeScriptSource, loadHermesParser } from './utils.js'; +import { + isIgnoredRepackDeepImport, + isTSXSource, + isTypeScriptSource, + loadHermesParser, +} from './utils.js'; export const raw = false; @@ -29,8 +34,8 @@ function buildBabelConfig(options: CustomTransformOptions): TransformOptions { minified: false, }; - if (options.includePlugins) { - config.plugins!.push(...options.includePlugins); + if (includePlugins) { + config.plugins!.push(...includePlugins); } const babelConfig = loadOptions(config); @@ -38,11 +43,15 @@ function buildBabelConfig(options: CustomTransformOptions): TransformOptions { throw new Error('Failed to load babel config'); } - if (options.excludePlugins && babelConfig.plugins) { + if (excludePlugins && babelConfig.plugins) { + const excludedPlugins = new Set(excludePlugins); babelConfig.plugins = babelConfig.plugins.filter( - (plugin: { key: string }) => { - return !options.excludePlugins!.includes(plugin.key); - } + (plugin: { key: string }) => + !( + excludedPlugins.has(plugin.key) || + (plugin.key === 'warn-on-deep-imports' && + isIgnoredRepackDeepImport(options.filename!)) + ) ); } @@ -64,7 +73,6 @@ export const transform = async ( ? parseSync(src, babelConfig) : hermesParser.parse(src, { babel: true, - flow: 'all', reactRuntimeTarget: '19', sourceType: babelConfig.sourceType, }); diff --git a/packages/repack/src/loaders/babelLoader/options.ts b/packages/repack/src/loaders/babelLoader/options.ts index 99a531d84..f8ee0b7ad 100644 --- a/packages/repack/src/loaders/babelLoader/options.ts +++ b/packages/repack/src/loaders/babelLoader/options.ts @@ -1,6 +1,16 @@ import type { TransformOptions } from '@babel/core'; -export interface BabelLoaderOptions extends TransformOptions {} +export interface HermesParserOverrides { + babel?: boolean; + flow?: 'all' | 'detect'; + reactRuntimeTarget?: '18' | '19'; + sourceType?: 'module' | 'script' | 'unambiguous'; +} + +export interface BabelLoaderOptions extends TransformOptions { + hermesParserPath?: string; + hermesParserOverrides?: HermesParserOverrides; +} export interface CustomTransformOptions extends TransformOptions { includePlugins?: Array]>; diff --git a/packages/repack/src/loaders/babelLoader/utils.ts b/packages/repack/src/loaders/babelLoader/utils.ts index 0359926c2..2572c540a 100644 --- a/packages/repack/src/loaders/babelLoader/utils.ts +++ b/packages/repack/src/loaders/babelLoader/utils.ts @@ -52,3 +52,16 @@ export async function loadHermesParser( ); } } + +const IGNORED_REPACK_FILENAMES = [ + 'IncludeModules.js', + 'WebpackHMRClient.js', +].map((name) => name.replace(/\./g, '\\.')); + +const IGNORED_REPACK_PATHS_REGEX = new RegExp( + `repack/dist/modules/(${IGNORED_REPACK_FILENAMES.join('|')})$` +); + +export function isIgnoredRepackDeepImport(filename: string): boolean { + return IGNORED_REPACK_PATHS_REGEX.test(filename); +} From 08c756da320e588d5b7bb50a01c3c0a8a9a08f97 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 19:10:09 +0200 Subject: [PATCH 46/61] feat: more customizable API --- .../src/loaders/babelLoader/babelLoader.ts | 73 ++++++++++++++----- .../repack/src/loaders/babelLoader/index.ts | 4 +- .../repack/src/loaders/babelLoader/options.ts | 8 +- .../repack/src/loaders/babelLoader/utils.ts | 9 ++- .../loaders/babelSwcLoader/babelSwcLoader.ts | 18 +++-- .../src/loaders/babelSwcLoader/options.ts | 5 +- .../src/loaders/babelSwcLoader/utils.ts | 4 +- 7 files changed, 83 insertions(+), 38 deletions(-) diff --git a/packages/repack/src/loaders/babelLoader/babelLoader.ts b/packages/repack/src/loaders/babelLoader/babelLoader.ts index e54505320..d031342d3 100644 --- a/packages/repack/src/loaders/babelLoader/babelLoader.ts +++ b/packages/repack/src/loaders/babelLoader/babelLoader.ts @@ -5,7 +5,11 @@ import { transformFromAstSync, } from '@babel/core'; import type { LoaderContext } from '@rspack/core'; -import type { BabelLoaderOptions, CustomTransformOptions } from './options.js'; +import type { + BabelLoaderOptions, + BabelPluginOverrides, + CustomTransformOptions, +} from './options.js'; import { isIgnoredRepackDeepImport, isTSXSource, @@ -15,16 +19,17 @@ import { export const raw = false; -function buildBabelConfig(options: CustomTransformOptions): TransformOptions { - const { includePlugins, excludePlugins, ...otherOptions } = options; - +function buildBabelConfig( + babelOptions: TransformOptions, + { includePlugins, excludePlugins }: BabelPluginOverrides +): TransformOptions { const config: TransformOptions = { babelrc: true, highlightCode: true, comments: true, plugins: [], sourceType: 'unambiguous', - ...otherOptions, + ...babelOptions, // output settings ast: false, code: true, @@ -50,7 +55,7 @@ function buildBabelConfig(options: CustomTransformOptions): TransformOptions { !( excludedPlugins.has(plugin.key) || (plugin.key === 'warn-on-deep-imports' && - isIgnoredRepackDeepImport(options.filename!)) + isIgnoredRepackDeepImport(babelOptions.filename!)) ) ); } @@ -60,30 +65,39 @@ function buildBabelConfig(options: CustomTransformOptions): TransformOptions { export const transform = async ( src: string, - options: CustomTransformOptions + transformOptions: TransformOptions, + customOptions?: CustomTransformOptions ) => { - const babelConfig = buildBabelConfig(options); - const projectRoot = options.root ?? options.cwd; + const babelConfig = buildBabelConfig(transformOptions, { + includePlugins: customOptions?.includePlugins, + excludePlugins: customOptions?.excludePlugins, + }); + const projectRoot = babelConfig.root ?? babelConfig.cwd; // load hermes parser dynamically to match the version from preset - const hermesParser = await loadHermesParser(projectRoot); + const hermesParser = await loadHermesParser( + projectRoot, + customOptions?.hermesParserPath + ); // filename will be always defined at this point const sourceAst = - isTypeScriptSource(options.filename!) || isTSXSource(options.filename!) + isTypeScriptSource(babelConfig.filename!) || + isTSXSource(babelConfig.filename!) ? parseSync(src, babelConfig) : hermesParser.parse(src, { babel: true, reactRuntimeTarget: '19', sourceType: babelConfig.sourceType, + ...customOptions?.hermesParserOverrides, }); if (!sourceAst) { - throw new Error(`Failed to parse source file: ${options.filename}`); + throw new Error(`Failed to parse source file: ${babelConfig.filename}`); } const result = transformFromAstSync(sourceAst, src, babelConfig); if (!result) { - throw new Error(`Failed to transform source file: ${options.filename}`); + throw new Error(`Failed to transform source file: ${babelConfig.filename}`); } return result; @@ -91,19 +105,38 @@ export const transform = async ( export default async function babelLoader( this: LoaderContext, - source: string + source: string, + sourceMap: string | undefined ) { this.cacheable(); const callback = this.async(); const options = this.getOptions(); + const { hermesParserPath, hermesParserOverrides, ...babelOverrides } = + options; + + const inputSourceMap = sourceMap ? JSON.parse(sourceMap) : undefined; + const withSourceMaps = this.resourcePath.match(/node_modules/) + ? false + : this.sourceMap; + try { - const result = await transform(source, { - sourceMaps: this.sourceMap, - ...options, - caller: { name: '@callstack/repack/babel-loader' }, - filename: this.resourcePath, - }); + const result = await transform( + source, + { + caller: { name: '@callstack/repack/babel-loader' }, + filename: this.resourcePath, + sourceMaps: withSourceMaps, + sourceFileName: this.resourcePath, + sourceRoot: this.context, + inputSourceMap: withSourceMaps ? inputSourceMap : undefined, + ...babelOverrides, + }, + { + hermesParserPath, + hermesParserOverrides, + } + ); callback(null, result.code ?? undefined, result.map ?? undefined); } catch (e) { callback(e as Error); diff --git a/packages/repack/src/loaders/babelLoader/index.ts b/packages/repack/src/loaders/babelLoader/index.ts index 1940d5a3b..8fd14636d 100644 --- a/packages/repack/src/loaders/babelLoader/index.ts +++ b/packages/repack/src/loaders/babelLoader/index.ts @@ -1,4 +1,4 @@ -import babelLoader, { transform, raw } from './babelLoader.js'; +import babelLoader, { raw } from './babelLoader.js'; -export { transform, raw }; +export { raw }; export default babelLoader; diff --git a/packages/repack/src/loaders/babelLoader/options.ts b/packages/repack/src/loaders/babelLoader/options.ts index f8ee0b7ad..af5d24299 100644 --- a/packages/repack/src/loaders/babelLoader/options.ts +++ b/packages/repack/src/loaders/babelLoader/options.ts @@ -7,12 +7,16 @@ export interface HermesParserOverrides { sourceType?: 'module' | 'script' | 'unambiguous'; } -export interface BabelLoaderOptions extends TransformOptions { +export interface HermesParserOptions { hermesParserPath?: string; hermesParserOverrides?: HermesParserOverrides; } -export interface CustomTransformOptions extends TransformOptions { +export interface BabelPluginOverrides { includePlugins?: Array]>; excludePlugins?: string[]; } + +export type BabelLoaderOptions = TransformOptions & HermesParserOptions; + +export type CustomTransformOptions = HermesParserOptions & BabelPluginOverrides; diff --git a/packages/repack/src/loaders/babelLoader/utils.ts b/packages/repack/src/loaders/babelLoader/utils.ts index 2572c540a..5b448d3cd 100644 --- a/packages/repack/src/loaders/babelLoader/utils.ts +++ b/packages/repack/src/loaders/babelLoader/utils.ts @@ -1,6 +1,6 @@ import type { ParseResult } from '@babel/core'; -export interface HermesParser { +interface HermesParser { parse: ( src: string, opts: { @@ -39,10 +39,13 @@ function resolveHermesParser(projectRoot: string) { } export async function loadHermesParser( - projectRoot?: string | null + projectRoot?: string | null, + providedHermesParserPath?: string ): Promise { try { - const hermesParserPath = resolveHermesParser(projectRoot ?? process.cwd()); + const hermesParserPath = + providedHermesParserPath ?? + resolveHermesParser(projectRoot ?? process.cwd()); const hermesParser = await import(hermesParserPath); return hermesParser; } catch (e) { diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index c40dc13ca..a44135a7b 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -5,7 +5,7 @@ import { getSupportedSwcCustomTransforms, getSupportedSwcNormalTransforms, } from '../../utils/internal/index.js'; -import { transform } from '../babelLoader/index.js'; +import { transform } from '../babelLoader/babelLoader.js'; import type { BabelSwcLoaderOptions } from './options.js'; import { checkParallelModeAvailable, @@ -115,24 +115,28 @@ export default async function babelSwcLoader( const swc = await lazyGetSwc(this); // if swc is not available, use babel to transform everything if (!swc) { - const { code, map } = await transform(source, baseBabelConfig); + const { code, map } = await transform(source, baseBabelConfig, { + hermesParserPath: options.hermesParserPath, + hermesParserOverrides: options.hermesParserOverrides, + }); callback(null, code ?? undefined, map ?? undefined); return; } - const babelConfig = getProjectBabelConfig(projectRoot); - const babelTransforms = + const babelConfig = getProjectBabelConfig(this.resourcePath, projectRoot); + const detectedBabelTransforms = babelConfig.plugins?.map((p) => [p.key, p.options] as BabelTransform) ?? []; const includeBabelPlugins = getExtraBabelPlugins(this.resourcePath); const { includedSwcTransforms, supportedSwcTransforms, swcConfig } = - partitionTransforms(this.resourcePath, babelTransforms); + partitionTransforms(this.resourcePath, detectedBabelTransforms); - const babelResult = await transform(source, { - ...baseBabelConfig, + const babelResult = await transform(source, baseBabelConfig, { excludePlugins: supportedSwcTransforms, includePlugins: includeBabelPlugins, + hermesParserPath: options.hermesParserPath, + hermesParserOverrides: options.hermesParserOverrides, }); const finalSwcConfig: SwcLoaderOptions = { diff --git a/packages/repack/src/loaders/babelSwcLoader/options.ts b/packages/repack/src/loaders/babelSwcLoader/options.ts index 394acf878..674cf51a8 100644 --- a/packages/repack/src/loaders/babelSwcLoader/options.ts +++ b/packages/repack/src/loaders/babelSwcLoader/options.ts @@ -1,12 +1,13 @@ import type { TransformOptions } from '@babel/core'; import type { SwcLoaderOptions } from '@rspack/core'; +import type { HermesParserOptions } from '../babelLoader/options.js'; type BabelOverrides = TransformOptions; type SwcOverrides = Omit; -export interface BabelSwcLoaderOptions { +export type BabelSwcLoaderOptions = { hideParallelModeWarning?: boolean; lazyImports?: boolean | string[]; babelOverrides?: BabelOverrides; swcOverrides?: SwcOverrides; -} +} & HermesParserOptions; diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index d7824ef03..4c0903fae 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -20,8 +20,8 @@ export function isJSXSource(fileName: string) { return !!fileName && fileName.endsWith('.jsx'); } -export function getProjectBabelConfig(projectRoot?: string) { - const babelConfig = loadOptions({ root: projectRoot }); +export function getProjectBabelConfig(filename: string, projectRoot?: string) { + const babelConfig = loadOptions({ filename, root: projectRoot }); return babelConfig ?? {}; } From 7c8233cca4fba0defd2b29954a1fe64c4fe4edfe Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 19:15:06 +0200 Subject: [PATCH 47/61] refactor: move swc helpers to babelSwcLoader --- .../repack/src/loaders/babelSwcLoader/babelSwcLoader.ts | 6 +++--- .../swcConfigHelpers.ts => loaders/babelSwcLoader/swc.ts} | 0 packages/repack/src/utils/internal/index.ts | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) rename packages/repack/src/{utils/internal/swcConfigHelpers.ts => loaders/babelSwcLoader/swc.ts} (100%) delete mode 100644 packages/repack/src/utils/internal/index.ts diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index a44135a7b..3eee9ac64 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -1,12 +1,12 @@ import type { TransformOptions } from '@babel/core'; import type { LoaderContext, SwcLoaderOptions } from '@rspack/core'; +import { transform } from '../babelLoader/babelLoader.js'; +import type { BabelSwcLoaderOptions } from './options.js'; import { getSupportedSwcConfigurableTransforms, getSupportedSwcCustomTransforms, getSupportedSwcNormalTransforms, -} from '../../utils/internal/index.js'; -import { transform } from '../babelLoader/babelLoader.js'; -import type { BabelSwcLoaderOptions } from './options.js'; +} from './swc.js'; import { checkParallelModeAvailable, getProjectBabelConfig, diff --git a/packages/repack/src/utils/internal/swcConfigHelpers.ts b/packages/repack/src/loaders/babelSwcLoader/swc.ts similarity index 100% rename from packages/repack/src/utils/internal/swcConfigHelpers.ts rename to packages/repack/src/loaders/babelSwcLoader/swc.ts diff --git a/packages/repack/src/utils/internal/index.ts b/packages/repack/src/utils/internal/index.ts deleted file mode 100644 index e0e0e7079..000000000 --- a/packages/repack/src/utils/internal/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './swcConfigHelpers.js'; From 6c140461bdc471c131bbb3510e67927d7126f598 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 19:21:31 +0200 Subject: [PATCH 48/61] feat: log warning in reanimated plugin and instruct users what to do --- packages/plugin-reanimated/src/loader.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/plugin-reanimated/src/loader.ts b/packages/plugin-reanimated/src/loader.ts index a3c33b681..6386b0c39 100644 --- a/packages/plugin-reanimated/src/loader.ts +++ b/packages/plugin-reanimated/src/loader.ts @@ -83,12 +83,17 @@ export function pitch( _previousRequest: string, data: ReanimatedLoaderData ) { + const logger = this.getLogger('RepackReanimatedLoader'); for (const loader of this.loaders) { // if the babel-swc-loader is found, we skip the reanimated-loader // since babel-swc-loader is more performant and uses the official // babel plugin directly if (loader.path === babelSwcLoader) { data.skip = true; + logger.warn( + 'This plugin should not be used with `@callstack/repack/babel-swc-loader`. ' + + 'Instead, add the `react-native-reanimated/plugin` (or `react-native-worklets/plugin`) directly to your `babel.config.js` file in the project root.' + ); } } } From 48059cfcd0106c5fa0c31c1d6e211977fc741fde Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 19:38:21 +0200 Subject: [PATCH 49/61] chore: remove unused --- packages/repack/src/loaders/babelSwcLoader/utils.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index 4c0903fae..e47413a42 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -16,10 +16,6 @@ export function isTSXSource(fileName: string) { return !!fileName && fileName.endsWith('.tsx'); } -export function isJSXSource(fileName: string) { - return !!fileName && fileName.endsWith('.jsx'); -} - export function getProjectBabelConfig(filename: string, projectRoot?: string) { const babelConfig = loadOptions({ filename, root: projectRoot }); return babelConfig ?? {}; From 5b30687cd77c46df5ecafcc93e3f62298992e2db Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Thu, 7 Aug 2025 22:45:16 +0200 Subject: [PATCH 50/61] fix: display reanimated warning only once --- packages/plugin-reanimated/src/loader.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/plugin-reanimated/src/loader.ts b/packages/plugin-reanimated/src/loader.ts index 6386b0c39..cb7c2afb1 100644 --- a/packages/plugin-reanimated/src/loader.ts +++ b/packages/plugin-reanimated/src/loader.ts @@ -76,6 +76,7 @@ export default function reanimatedLoader( // resolve the path to the babel-swc-loader once const babelSwcLoader = require.resolve('@callstack/repack/babel-swc-loader'); +let warningDisplayed = false; export function pitch( this: LoaderContext, @@ -90,10 +91,13 @@ export function pitch( // babel plugin directly if (loader.path === babelSwcLoader) { data.skip = true; - logger.warn( - 'This plugin should not be used with `@callstack/repack/babel-swc-loader`. ' + - 'Instead, add the `react-native-reanimated/plugin` (or `react-native-worklets/plugin`) directly to your `babel.config.js` file in the project root.' - ); + if (!warningDisplayed) { + warningDisplayed = true; + logger.warn( + '`@callstack/repack-plugin-reanimated` should not be used with `@callstack/repack/babel-swc-loader`. ' + + 'Instead, add the `react-native-reanimated/plugin` (or `react-native-worklets/plugin`) directly to your list of babel plugins in the `babel.config.js` file in the project root.' + ); + } } } } From 071121f9e9ce8ff8eba0507dd4a84f61aff34fda Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Fri, 8 Aug 2025 00:27:53 +0200 Subject: [PATCH 51/61] wip: max workers --- .../src/commands/common/setupEnvironment.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/repack/src/commands/common/setupEnvironment.ts b/packages/repack/src/commands/common/setupEnvironment.ts index cf340ee03..666bccaa4 100644 --- a/packages/repack/src/commands/common/setupEnvironment.ts +++ b/packages/repack/src/commands/common/setupEnvironment.ts @@ -1,3 +1,4 @@ +import os from 'node:os'; import { ASSETS_DEST_ENV_KEY, BUNDLE_FILENAME_ENV_KEY, @@ -18,9 +19,23 @@ interface EnvironmentArgs { verbose?: boolean; } +const cores = os.availableParallelism(); + +function getMaxWorkers() { + return Math.max( + 1, + Math.ceil(cores * (0.5 + 0.5 * Math.exp(-cores * 0.07)) - 1) + ).toString(); +} + export function setupEnvironment(args: EnvironmentArgs): void { + const maxWorkers = getMaxWorkers(); + console.log('cpu cores / workers', cores, maxWorkers); setEnvVar(VERBOSE_ENV_KEY, args.verbose ? 'true' : undefined); setEnvVar(BUNDLE_FILENAME_ENV_KEY, args.bundleOutput); setEnvVar(SOURCEMAP_FILENAME_ENV_KEY, args.sourcemapOutput); setEnvVar(ASSETS_DEST_ENV_KEY, args.assetsDest); + // TODO: move to a more appropriate place + setEnvVar('TOKIO_WORKER_THREADS', maxWorkers); + setEnvVar('RAYON_NUM_THREADS', maxWorkers); } From 88068c6f736f9542faeef89a64f967a328c8025a Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 11 Aug 2025 22:57:02 +0200 Subject: [PATCH 52/61] test: add tests for exclude & include plugins functionality --- .../__snapshots__/babelLoader.test.ts.snap | 32 ++++++++ .../babelLoader/__tests__/babelLoader.test.ts | 82 +++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 packages/repack/src/loaders/babelLoader/__tests__/__snapshots__/babelLoader.test.ts.snap create mode 100644 packages/repack/src/loaders/babelLoader/__tests__/babelLoader.test.ts diff --git a/packages/repack/src/loaders/babelLoader/__tests__/__snapshots__/babelLoader.test.ts.snap b/packages/repack/src/loaders/babelLoader/__tests__/__snapshots__/babelLoader.test.ts.snap new file mode 100644 index 000000000..bc9d7b6cd --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/__tests__/__snapshots__/babelLoader.test.ts.snap @@ -0,0 +1,32 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`babelLoader excludePlugins by default transforms ESM modules to CJS (baseline) 1`] = ` +""use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.default = void 0; +var _bar = _interopRequireDefault(require("bar")); +function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } +var _default = exports.default = _bar.default;" +`; + +exports[`babelLoader excludePlugins excludes transform-modules-commonjs so ESM stays intact 1`] = ` +"import foo from "bar"; +export default foo;" +`; + +exports[`babelLoader includePlugins includes @babel/plugin-transform-react-jsx and transforms JSX 1`] = ` +""use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +exports.Component = void 0; +var _jsxRuntime = require("react/jsx-runtime"); +const Component = () => /*#__PURE__*/(0, _jsxRuntime.jsx)(View, { + test: 1 +}); +exports.Component = Component;" +`; diff --git a/packages/repack/src/loaders/babelLoader/__tests__/babelLoader.test.ts b/packages/repack/src/loaders/babelLoader/__tests__/babelLoader.test.ts new file mode 100644 index 000000000..5bc77a195 --- /dev/null +++ b/packages/repack/src/loaders/babelLoader/__tests__/babelLoader.test.ts @@ -0,0 +1,82 @@ +import { transform } from '../babelLoader.js'; + +jest.mock('../utils.js', () => { + const actual = jest.requireActual('../utils.js'); + const { parseSync } = require('@babel/core'); + return { + ...actual, + loadHermesParser: jest.fn(async () => ({ + parse: ( + src: string, + opts: { sourceType?: 'script' | 'module' | 'unambiguous' } + ) => + parseSync(src, { + sourceType: opts?.sourceType ?? 'unambiguous', + }), + })), + }; +}); + +describe('babelLoader', () => { + describe('includePlugins', () => { + it('includes @babel/plugin-transform-react-jsx and transforms JSX', async () => { + const src = 'export const Component = () => ;'; + + const result = await transform( + src, + { + caller: { name: 'jest-babel-loader-test' }, + filename: '/virtual/Component.tsx', + sourceMaps: false, + sourceFileName: '/virtual/Component.tsx', + sourceRoot: '/virtual', + envName: 'production', + }, + { + includePlugins: [ + [ + '@babel/plugin-transform-react-jsx', + { runtime: 'automatic', importSource: 'react' }, + ], + ], + } + ); + + expect(result.code).toMatchSnapshot(); + }); + }); + + describe('excludePlugins', () => { + const esmSrc = 'import foo from "bar"; export default foo;'; + + it('by default transforms ESM modules to CJS (baseline)', async () => { + const result = await transform(esmSrc, { + caller: { name: 'jest-babel-loader-test' }, + filename: '/virtual/esm.ts', + sourceMaps: false, + sourceFileName: '/virtual/esm.ts', + sourceRoot: '/virtual', + envName: 'production', + }); + + expect(result.code).toMatchSnapshot(); + }); + + it('excludes transform-modules-commonjs so ESM stays intact', async () => { + const result = await transform( + esmSrc, + { + caller: { name: 'jest-babel-loader-test' }, + filename: '/virtual/esm.ts', + sourceMaps: false, + sourceFileName: '/virtual/esm.ts', + sourceRoot: '/virtual', + envName: 'production', + }, + { excludePlugins: ['transform-modules-commonjs'] } + ); + + expect(result.code).toMatchSnapshot(); + }); + }); +}); From 95d856640ef6033f3607be8befff0e3aaf796b83 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 11 Aug 2025 23:01:10 +0200 Subject: [PATCH 53/61] refactor: move to utils --- .../loaders/babelSwcLoader/babelSwcLoader.ts | 22 +------------------ .../src/loaders/babelSwcLoader/utils.ts | 19 ++++++++++++++++ 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index 3eee9ac64..924a765f0 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -9,11 +9,10 @@ import { } from './swc.js'; import { checkParallelModeAvailable, + getExtraBabelPlugins, getProjectBabelConfig, getProjectRootPath, getSwcParserConfig, - isTSXSource, - isTypeScriptSource, lazyGetSwc, } from './utils.js'; @@ -22,25 +21,6 @@ type InputSourceMap = TransformOptions['inputSourceMap']; export const raw = false; -function getExtraBabelPlugins(filename: string) { - const extraBabelPlugins: Array]> = []; - // add TS syntax plugins since RN preset - // only uses transform-typescript plugin - // which includes the syntax-typescript plugin - if (isTypeScriptSource(filename)) { - extraBabelPlugins.push([ - '@babel/plugin-syntax-typescript', - { isTSX: false, allowNamespaces: true }, - ]); - } else if (isTSXSource(filename)) { - extraBabelPlugins.push([ - '@babel/plugin-syntax-typescript', - { isTSX: true, allowNamespaces: true }, - ]); - } - return extraBabelPlugins; -} - function partitionTransforms( filename: string, babelTransforms: BabelTransform[] diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index e47413a42..1ca3fadaf 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -21,6 +21,25 @@ export function getProjectBabelConfig(filename: string, projectRoot?: string) { return babelConfig ?? {}; } +export function getExtraBabelPlugins(filename: string) { + const extraBabelPlugins: Array]> = []; + // add TS syntax plugins since RN preset + // only uses transform-typescript plugin + // which includes the syntax-typescript plugin + if (isTypeScriptSource(filename)) { + extraBabelPlugins.push([ + '@babel/plugin-syntax-typescript', + { isTSX: false, allowNamespaces: true }, + ]); + } else if (isTSXSource(filename)) { + extraBabelPlugins.push([ + '@babel/plugin-syntax-typescript', + { isTSX: true, allowNamespaces: true }, + ]); + } + return extraBabelPlugins; +} + export function getSwcParserConfig(filename: string): SwcLoaderParserConfig { if (isTypeScriptSource(filename)) { return { syntax: 'typescript', tsx: false }; From 62b545ac91a268a756743a383d276d5fb4fff827 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 11 Aug 2025 23:02:46 +0200 Subject: [PATCH 54/61] chore: comment --- packages/repack/src/loaders/babelSwcLoader/swc.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/repack/src/loaders/babelSwcLoader/swc.ts b/packages/repack/src/loaders/babelSwcLoader/swc.ts index e04888bd3..353449d83 100644 --- a/packages/repack/src/loaders/babelSwcLoader/swc.ts +++ b/packages/repack/src/loaders/babelSwcLoader/swc.ts @@ -22,6 +22,8 @@ const SWC_SUPPORTED_NORMAL_RULES = new Set([ 'transform-computed-properties', ]); +// NOTE: 'transform-class-properties' and 'transform-private-methods' are disabled here +// because, when combined with loose mode, these cause an internal swc error. Needs fixing upstream const SWC_SUPPORTED_CONFIGURABLE_RULES = new Set([ // 'transform-class-properties', // 'transform-private-methods', From fe84d9e2f52be2baeb94863045a38ac300495f9e Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 11 Aug 2025 23:11:48 +0200 Subject: [PATCH 55/61] tests: swc --- .../babelSwcLoader/__tests__/swc.test.ts | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts diff --git a/packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts b/packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts new file mode 100644 index 000000000..b9056b0de --- /dev/null +++ b/packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts @@ -0,0 +1,92 @@ +import type { SwcLoaderOptions } from '@rspack/core'; +import { + getSupportedSwcConfigurableTransforms, + getSupportedSwcCustomTransforms, + getSupportedSwcNormalTransforms, +} from '../swc.js'; + +type TransformEntry = [string, Record | undefined]; + +describe('swc transforms support detection', () => { + describe('getSupportedSwcNormalTransforms', () => { + it('returns only supported normal transform names preserving order', () => { + const transforms: TransformEntry[] = [ + ['transform-block-scoping', undefined], + ['transform-classes', {}], + ['transform-react-jsx', undefined], // custom + ['transform-private-methods', undefined], // configurable (disabled) + ['unknown-plugin', undefined], + ['transform-object-rest-spread', undefined], // configurable + ]; + + const result = getSupportedSwcNormalTransforms(transforms); + + expect(result).toEqual(['transform-block-scoping', 'transform-classes']); + }); + }); + + describe('getSupportedSwcConfigurableTransforms', () => { + it('returns only supported configurable transform names preserving order', () => { + const baseSwcConfig = {}; + const transforms: TransformEntry[] = [ + ['transform-class-properties', { loose: true }], // disabled + ['transform-private-methods', { loose: true }], // disabled + ['transform-private-property-in-object', {}], + ['transform-object-rest-spread', {}], + ['transform-optional-chaining', {}], + ['transform-nullish-coalescing-operator', {}], + ['transform-for-of', {}], + ['transform-runtime', {}], // custom + ['transform-block-scoping', {}], // normal + ['unknown-plugin', {}], + ]; + + const { transformNames } = getSupportedSwcConfigurableTransforms( + transforms, + baseSwcConfig as SwcLoaderOptions + ); + + expect(transformNames).toEqual([ + 'transform-private-property-in-object', + 'transform-object-rest-spread', + 'transform-optional-chaining', + 'transform-nullish-coalescing-operator', + 'transform-for-of', + ]); + }); + }); + + describe('getSupportedSwcCustomTransforms', () => { + it('returns only supported custom transform names preserving order', () => { + const baseSwcConfig = {}; + const transforms: TransformEntry[] = [ + ['transform-runtime', {}], + [ + 'transform-react-jsx', + { runtime: 'automatic', importSource: 'react' }, + ], + ['transform-react-jsx-self', {}], + ['transform-react-jsx-source', {}], + ['transform-modules-commonjs', {}], + ['proposal-export-default-from', {}], + ['transform-block-scoping', {}], // normal + ['transform-private-methods', {}], // configurable (disabled) + ['unknown-plugin', {}], + ]; + + const { transformNames } = getSupportedSwcCustomTransforms( + transforms, + baseSwcConfig as SwcLoaderOptions + ); + + expect(transformNames).toEqual([ + 'transform-runtime', + 'transform-react-jsx', + 'transform-react-jsx-self', + 'transform-react-jsx-source', + 'transform-modules-commonjs', + 'proposal-export-default-from', + ]); + }); + }); +}); From 56b67b7548b8d3f1cd6460cce49fd4235241b0d9 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 11 Aug 2025 23:29:15 +0200 Subject: [PATCH 56/61] tests: swc updated --- .../__tests__/__snapshots__/swc.test.ts.snap | 68 +++++++++ .../babelSwcLoader/__tests__/swc.test.ts | 132 ++++++++++++++++++ 2 files changed, 200 insertions(+) create mode 100644 packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/swc.test.ts.snap diff --git a/packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/swc.test.ts.snap b/packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/swc.test.ts.snap new file mode 100644 index 000000000..f8a54912a --- /dev/null +++ b/packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/swc.test.ts.snap @@ -0,0 +1,68 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`swc transforms support detection getSupportedSwcConfigurableTransforms applies loose mode to setSpreadProperties when not defined; preserves explicit true (snapshot): object-rest-spread explicit true preserved 1`] = ` +{ + "setSpreadProperties": true, +} +`; + +exports[`swc transforms support detection getSupportedSwcConfigurableTransforms applies loose mode to setSpreadProperties when not defined; preserves explicit true (snapshot): object-rest-spread loose: setSpreadProperties 1`] = ` +{ + "setSpreadProperties": true, +} +`; + +exports[`swc transforms support detection getSupportedSwcConfigurableTransforms sets optional-chaining/nullish and for-of assumptions with loose mode and respects explicit values (snapshot): optional-chaining/nullish and for-of assumptions 1`] = ` +{ + "noDocumentAll": true, + "skipForOfIteratorClosing": true, +} +`; + +exports[`swc transforms support detection getSupportedSwcConfigurableTransforms updates both privateFieldsAsProperties and setPublicClassFields for private-property-in-object but does not override explicit true (snapshot): private-property-in-object assumptions and names 1`] = ` +{ + "assumptions": { + "privateFieldsAsProperties": true, + "setPublicClassFields": true, + }, + "transformNames": [ + "transform-private-property-in-object", + ], +} +`; + +exports[`swc transforms support detection getSupportedSwcCustomTransforms configures modules commonjs options based on provided config (snapshot): modules commonjs config 1`] = ` +{ + "allowTopLevelThis": false, + "ignoreDynamic": true, + "strict": false, + "strictMode": true, + "type": "commonjs", +} +`; + +exports[`swc transforms support detection getSupportedSwcCustomTransforms enables external helpers via transform-runtime (snapshot): runtime externalHelpers 1`] = ` +{ + "externalHelpers": true, +} +`; + +exports[`swc transforms support detection getSupportedSwcCustomTransforms overrides react runtime and importSource from transform-react-jsx config (snapshot): react runtime override 1`] = ` +{ + "importSource": "react/jsx", + "runtime": "automatic", +} +`; + +exports[`swc transforms support detection getSupportedSwcCustomTransforms sets exportDefaultFrom only for ecmascript parser; leaves typescript parser unchanged (snapshot): parser: ecmascript with exportDefaultFrom 1`] = ` +{ + "exportDefaultFrom": true, + "syntax": "ecmascript", +} +`; + +exports[`swc transforms support detection getSupportedSwcCustomTransforms sets exportDefaultFrom only for ecmascript parser; leaves typescript parser unchanged (snapshot): parser: typescript unchanged 1`] = ` +{ + "syntax": "typescript", +} +`; diff --git a/packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts b/packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts index b9056b0de..066ff7406 100644 --- a/packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts +++ b/packages/repack/src/loaders/babelSwcLoader/__tests__/swc.test.ts @@ -54,6 +54,71 @@ describe('swc transforms support detection', () => { 'transform-for-of', ]); }); + + it('applies loose mode to setSpreadProperties when not defined; preserves explicit true (snapshot)', () => { + const baseUndefined = {} as SwcLoaderOptions; + const { swcConfig: cfg1 } = getSupportedSwcConfigurableTransforms( + [['transform-object-rest-spread', { loose: true }]], + baseUndefined + ); + + expect(cfg1.jsc?.assumptions).toMatchSnapshot( + 'object-rest-spread loose: setSpreadProperties' + ); + + const baseTrue: SwcLoaderOptions = { + jsc: { assumptions: { setSpreadProperties: true } }, + } as SwcLoaderOptions; + const { swcConfig: cfg2 } = getSupportedSwcConfigurableTransforms( + [['transform-object-rest-spread', { loose: false }]], + baseTrue + ); + + expect(cfg2.jsc?.assumptions).toMatchSnapshot( + 'object-rest-spread explicit true preserved' + ); + }); + + it('sets optional-chaining/nullish and for-of assumptions with loose mode and respects explicit values (snapshot)', () => { + const base: SwcLoaderOptions = { + jsc: { assumptions: { noDocumentAll: true } }, + } as SwcLoaderOptions; + + const { swcConfig } = getSupportedSwcConfigurableTransforms( + [ + ['transform-optional-chaining', { loose: false }], + ['transform-nullish-coalescing-operator', { loose: true }], + ['transform-for-of', { loose: true }], + ], + base + ); + + expect(swcConfig.jsc?.assumptions).toMatchSnapshot( + 'optional-chaining/nullish and for-of assumptions' + ); + }); + + it('updates both privateFieldsAsProperties and setPublicClassFields for private-property-in-object but does not override explicit true (snapshot)', () => { + const base: SwcLoaderOptions = { + jsc: { + assumptions: { + privateFieldsAsProperties: true, + setPublicClassFields: true, + }, + }, + } as SwcLoaderOptions; + + const { swcConfig, transformNames } = + getSupportedSwcConfigurableTransforms( + [['transform-private-property-in-object', { loose: false }]], + base + ); + + expect({ + transformNames, + assumptions: swcConfig.jsc?.assumptions, + }).toMatchSnapshot('private-property-in-object assumptions and names'); + }); }); describe('getSupportedSwcCustomTransforms', () => { @@ -88,5 +153,72 @@ describe('swc transforms support detection', () => { 'proposal-export-default-from', ]); }); + + it('overrides react runtime and importSource from transform-react-jsx config (snapshot)', () => { + const inputConfig: SwcLoaderOptions = { + jsc: { + transform: { react: { runtime: 'classic', importSource: 'preact' } }, + }, + }; + const { swcConfig } = getSupportedSwcCustomTransforms( + [ + [ + 'transform-react-jsx', + { runtime: 'automatic', importSource: 'react/jsx' }, + ], + ], + inputConfig + ); + + expect(swcConfig.jsc?.transform?.react).toMatchSnapshot( + 'react runtime override' + ); + }); + + it('configures modules commonjs options based on provided config (snapshot)', () => { + const inputConfig: SwcLoaderOptions = {}; + const { swcConfig } = getSupportedSwcCustomTransforms( + [ + [ + 'transform-modules-commonjs', + { strict: false, strictMode: true, allowTopLevelThis: false }, + ], + ], + inputConfig + ); + expect(swcConfig.module).toMatchSnapshot('modules commonjs config'); + }); + + it('enables external helpers via transform-runtime (snapshot)', () => { + const inputConfig: SwcLoaderOptions = {}; + const { swcConfig } = getSupportedSwcCustomTransforms( + [['transform-runtime', {}]], + inputConfig + ); + expect(swcConfig.jsc).toMatchSnapshot('runtime externalHelpers'); + }); + + it('sets exportDefaultFrom only for ecmascript parser; leaves typescript parser unchanged (snapshot)', () => { + const inputConfigTs: SwcLoaderOptions = { + jsc: { parser: { syntax: 'typescript' } }, + } as SwcLoaderOptions; + + const { swcConfig: tsCfg } = getSupportedSwcCustomTransforms( + [['proposal-export-default-from', {}]], + inputConfigTs + ); + expect(tsCfg.jsc?.parser).toMatchSnapshot('parser: typescript unchanged'); + + const inputConfigEcma: SwcLoaderOptions = { + jsc: { parser: { syntax: 'ecmascript' } }, + } as SwcLoaderOptions; + const { swcConfig: ecmaCfg } = getSupportedSwcCustomTransforms( + [['proposal-export-default-from', {}]], + inputConfigEcma + ); + expect(ecmaCfg.jsc?.parser).toMatchSnapshot( + 'parser: ecmascript with exportDefaultFrom' + ); + }); }); }); From 523bfffbb2d7f74011fcfbdc2938f2f942a72524 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 11 Aug 2025 23:39:59 +0200 Subject: [PATCH 57/61] tests: babelSwcLoader --- .../__snapshots__/babelSwcLoader.test.ts.snap | 75 +++++++++++++++++++ .../__tests__/babelSwcLoader.test.ts | 68 +++++++++++++++++ .../loaders/babelSwcLoader/babelSwcLoader.ts | 2 +- 3 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/babelSwcLoader.test.ts.snap create mode 100644 packages/repack/src/loaders/babelSwcLoader/__tests__/babelSwcLoader.test.ts diff --git a/packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/babelSwcLoader.test.ts.snap b/packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/babelSwcLoader.test.ts.snap new file mode 100644 index 000000000..1d912f68e --- /dev/null +++ b/packages/repack/src/loaders/babelSwcLoader/__tests__/__snapshots__/babelSwcLoader.test.ts.snap @@ -0,0 +1,75 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`partitionTransforms ignores unsupported and disabled transforms (snapshot): unsupported and disabled 1`] = ` +{ + "includedSwcTransforms": [], + "supportedSwcTransforms": [], + "swcConfig": { + "jsc": { + "parser": { + "jsx": true, + "syntax": "ecmascript", + }, + "transform": { + "react": { + "useBuiltins": true, + }, + }, + }, + }, +} +`; + +exports[`partitionTransforms only custom transforms are excluded from included set but present in supported set (snapshot): custom-only supported set 1`] = ` +{ + "includedSwcTransforms": [], + "supportedSwcTransforms": [ + "transform-react-jsx", + "transform-modules-commonjs", + "proposal-export-default-from", + ], + "swcConfig": { + "jsc": { + "parser": { + "exportDefaultFrom": true, + "jsx": true, + "syntax": "ecmascript", + }, + "transform": { + "react": { + "importSource": undefined, + "runtime": undefined, + "useBuiltins": true, + }, + }, + }, + "module": { + "allowTopLevelThis": false, + "ignoreDynamic": true, + "strict": false, + "strictMode": false, + "type": "commonjs", + }, + }, +} +`; + +exports[`partitionTransforms returns empty arrays when no transforms are specified (snapshot): empty arrays 1`] = ` +{ + "includedSwcTransforms": [], + "supportedSwcTransforms": [], + "swcConfig": { + "jsc": { + "parser": { + "syntax": "typescript", + "tsx": false, + }, + "transform": { + "react": { + "useBuiltins": true, + }, + }, + }, + }, +} +`; diff --git a/packages/repack/src/loaders/babelSwcLoader/__tests__/babelSwcLoader.test.ts b/packages/repack/src/loaders/babelSwcLoader/__tests__/babelSwcLoader.test.ts new file mode 100644 index 000000000..1ad931261 --- /dev/null +++ b/packages/repack/src/loaders/babelSwcLoader/__tests__/babelSwcLoader.test.ts @@ -0,0 +1,68 @@ +import { partitionTransforms } from '../babelSwcLoader.js'; + +type TransformEntry = [string, Record | undefined]; + +describe('partitionTransforms', () => { + it('partitions normal, configurable, and custom transforms preserving order', () => { + const transforms: TransformEntry[] = [ + ['transform-block-scoping', {}], + ['transform-react-jsx', {}], + ['transform-object-rest-spread', { loose: true }], + ['transform-class-properties', { loose: true }], // disabled configurable + ['transform-private-methods', { loose: true }], // disabled configurable + ['unknown-plugin', {}], + ['transform-modules-commonjs', {}], + ['transform-classes', {}], + ['transform-for-of', {}], + ]; + + const { includedSwcTransforms, supportedSwcTransforms } = + partitionTransforms('/virtual/file.tsx', transforms); + + expect(includedSwcTransforms).toEqual([ + 'transform-block-scoping', + 'transform-classes', + 'transform-object-rest-spread', + 'transform-for-of', + ]); + + expect(supportedSwcTransforms).toEqual([ + 'transform-block-scoping', + 'transform-classes', + 'transform-object-rest-spread', + 'transform-for-of', + 'transform-react-jsx', + 'transform-modules-commonjs', + ]); + }); + + it('ignores unsupported and disabled transforms (snapshot)', () => { + const transforms: TransformEntry[] = [ + ['transform-class-properties', { loose: true }], // disabled + ['transform-private-methods', { loose: true }], // disabled + ['unknown-plugin', {}], + ]; + + const result = partitionTransforms('/virtual/file.js', transforms); + + expect(result).toMatchSnapshot('unsupported and disabled'); + }); + + it('only custom transforms are excluded from included set but present in supported set (snapshot)', () => { + const transforms: TransformEntry[] = [ + ['transform-react-jsx', {}], + ['transform-modules-commonjs', {}], + ['proposal-export-default-from', {}], + ]; + + const result = partitionTransforms('/virtual/file.jsx', transforms); + + expect(result).toMatchSnapshot('custom-only supported set'); + }); + + it('returns empty arrays when no transforms are specified (snapshot)', () => { + const result = partitionTransforms('/virtual/empty.ts', []); + + expect(result).toMatchSnapshot('empty arrays'); + }); +}); diff --git a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts index 924a765f0..1d4680c10 100644 --- a/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts +++ b/packages/repack/src/loaders/babelSwcLoader/babelSwcLoader.ts @@ -21,7 +21,7 @@ type InputSourceMap = TransformOptions['inputSourceMap']; export const raw = false; -function partitionTransforms( +export function partitionTransforms( filename: string, babelTransforms: BabelTransform[] ) { From 80d2f4b3376c446b4169e7733859995c241c23eb Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 18 Aug 2025 19:28:24 +0200 Subject: [PATCH 58/61] docs: docs for babel loader and babel swc loader --- website/src/latest/api/loaders/_meta.json | 8 +- .../src/latest/api/loaders/babel-loader.md | 78 ++++++++++++ .../latest/api/loaders/babel-swc-loader.md | 112 ++++++++++++++++++ 3 files changed, 197 insertions(+), 1 deletion(-) create mode 100644 website/src/latest/api/loaders/babel-loader.md create mode 100644 website/src/latest/api/loaders/babel-swc-loader.md diff --git a/website/src/latest/api/loaders/_meta.json b/website/src/latest/api/loaders/_meta.json index 40517c8a1..f7e9929b4 100644 --- a/website/src/latest/api/loaders/_meta.json +++ b/website/src/latest/api/loaders/_meta.json @@ -1 +1,7 @@ -["assets-loader", "flow-loader", "react-refresh-loader"] +[ + "assets-loader", + "babel-loader", + "babel-swc-loader", + "flow-loader", + "react-refresh-loader" +] diff --git a/website/src/latest/api/loaders/babel-loader.md b/website/src/latest/api/loaders/babel-loader.md new file mode 100644 index 000000000..0894dd41c --- /dev/null +++ b/website/src/latest/api/loaders/babel-loader.md @@ -0,0 +1,78 @@ +# BabelLoader + +The `BabelLoader` runs Babel transformations for JavaScript and TypeScript sources in React Native projects. It chooses the parser based on source type: `hermes-parser` for JavaScript and Flow-typed files, and Babel's standard parser for TypeScript files. + +:::info How this loader differs from babel-loader + +There are two similarly named loaders: `@callstack/repack/babel-loader` (this loader) and `babel-loader` from npm. This loader is tailored for Re.Pack and aims for Metro parity, so the same Babel config used in Metro works as-is in Re.Pack. It automatically selects the parser by source type (Hermes parser for JS/JSX and Flow, Babel parser for TypeScript). + +It is also optimized for parallel transforms. In Rspack, enable [`experiments.parallelLoader`](https://rspack.rs/config/experiments#experimentsparallelloader) to fan out transforms; in webpack, pair it with [`thread-loader`](https://www.npmjs.com/package/thread-loader) to run a worker pool. On projects with heavier Babel pipelines, this often translates into noticeably faster builds. + +::: + +## Options + +```ts +// All Babel options from `@babel/core` are supported +type BabelTransformOptions = import('@babel/core').TransformOptions + +type BabelLoaderOptions = BabelTransformOptions & { + babel?: boolean; + flow?: "all" | "detect"; + reactRuntimeTarget?: "18" | "19"; + sourceType?: "module" | "script" | "unambiguous"; +}; +``` + +All options from the [Babel options documentation](https://babeljs.io/docs/options) are supported. See [Babel TransformOptions](#babel-transformoptions) below for more details. + + +### hermesParserPath + +- Type: `string` + +Optional path to use for importing `hermes-parser`. By default, the path is obtained automatically. + +### hermesParserOverrides + +- Type: `HermesParserOverrides` +- Default: `{ babel: true, reactRuntimeTarget: '19' }` + +Overrides passed to `hermes-parser` when parsing non-TypeScript files. + +```ts +type HermesParserOverrides = { + babel?: boolean; + flow?: "all" | "detect"; + reactRuntimeTarget?: "18" | "19"; + sourceType?: "module" | "script" | "unambiguous"; +}; +``` + +## Babel TransformOptions + +You can pass any standard Babel options (e.g. `presets`, `plugins`, `overrides`, etc.). Source maps are enabled automatically for application code and disabled for `node_modules` by default. + +## Example + +```js title=rspack.config.mjs +export default { + module: { + rules: [ + { + test: /\.[cm]?[jt]sx?$/, + type: "javascript/auto", + use: { + loader: "@callstack/repack/babel-loader", + options: { + presets: ["module:@react-native/babel-preset"], + plugins: ["react-native-reanimated/plugin"], + comments: true + }, + }, + }, + ], + }, +}; +``` + diff --git a/website/src/latest/api/loaders/babel-swc-loader.md b/website/src/latest/api/loaders/babel-swc-loader.md new file mode 100644 index 000000000..70aa80193 --- /dev/null +++ b/website/src/latest/api/loaders/babel-swc-loader.md @@ -0,0 +1,112 @@ +# BabelSwcLoader + +The `BabelSwcLoader` combines Babel and SWC to speed up transformations while preserving compatibility with complex Babel setups. It: + +- Runs Babel first to apply your project Babel config (minus transforms that SWC can handle) +- Detects supported Babel transforms and re-applies them via SWC for performance +- Optionally uses SWC for module lazy loading and other optimizations + +If SWC is not available in the environment, it falls back to pure Babel automatically. + +:::details +This loader inspects your Babel config to partition transforms into SWC-supported buckets and configures `@rspack/core`/`@swc/core` accordingly. It also appends required Babel syntax plugins for `.ts/.tsx` sources. +::: + +## Options + +```ts +import type { TransformOptions } from "@babel/core"; +import type { SwcLoaderOptions } from "@rspack/core"; + +type HermesParserOverrides = { + babel?: boolean; + flow?: "all" | "detect"; + reactRuntimeTarget?: "18" | "19"; + sourceType?: "module" | "script" | "unambiguous"; +}; + +type HermesParserOptions = { + hermesParserPath?: string; + hermesParserOverrides?: HermesParserOverrides; +}; + +type BabelOverrides = TransformOptions; +type SwcOverrides = Omit; + +type BabelSwcLoaderOptions = { + hideParallelModeWarning?: boolean; + lazyImports?: boolean | string[]; + babelOverrides?: BabelOverrides; + swcOverrides?: SwcOverrides; +} & HermesParserOptions; +``` + +### hideParallelModeWarning + +- Type: `boolean` +- Default: `false` + +Hide the warning about Rspack `experiments.parallelLoader` when the rule isn't marked `parallel: true`. + +### lazyImports + +- Type: `boolean | string[]` +- Default: `true` + +Enables SWC's lazy import evaluation for faster startup. You can also provide an allowlist of module names. + +### babelOverrides + +- Type: `@babel/core` `TransformOptions` + +Additional Babel options merged into the auto-detected project config for the current file. + +### swcOverrides + +- Type: `Omit` + +Additional SWC loader options merged after the loader's computed SWC configuration. + +### hermesParserPath / hermesParserOverrides + +Same as in [`BabelLoader`](/api/loaders/babel-loader#options). + +## Behavior details + +- Automatically disables source maps for `node_modules` and enables them for app sources. +- Detects Babel plugins in your project config, filters out ones supported by SWC, and re-applies them using SWC for performance. +- Always includes Babel syntax plugins for `.ts`/`.tsx` files to match React Native expectations. +- If SWC can't be resolved (via Rspack experiments or `@swc/core`), the loader uses pure Babel. + +## Examples + +```js title=rspack.config.cjs +module.exports = { + module: { + rules: [ + { + test: /\.[jt]sx?$/, + exclude: /node_modules/, + type: "javascript/auto", + // Optional: speed up with parallel threads in Rspack + // parallel: true, + use: { + loader: "@callstack/repack/babel-swc-loader", + options: { + lazyImports: true, + babelOverrides: { + presets: ["module:metro-react-native-babel-preset"], + plugins: ["react-native-reanimated/plugin"], + }, + }, + }, + }, + ], + }, +}; +``` + +:::tip +If you're already using `getJsTransformRules`, you typically don't need to add this loader manually. Use `BabelSwcLoader` if you want a hybrid Babel+SWC pipeline while keeping your existing Babel config. +::: + From 27fbe5f22854c3da679febd7fd7f8b8806286e94 Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 18 Aug 2025 20:14:18 +0200 Subject: [PATCH 59/61] docs: improve babel-swc-loader docs --- .../latest/api/loaders/babel-swc-loader.md | 125 ++++++++++-------- 1 file changed, 69 insertions(+), 56 deletions(-) diff --git a/website/src/latest/api/loaders/babel-swc-loader.md b/website/src/latest/api/loaders/babel-swc-loader.md index 70aa80193..8392e7fb4 100644 --- a/website/src/latest/api/loaders/babel-swc-loader.md +++ b/website/src/latest/api/loaders/babel-swc-loader.md @@ -1,103 +1,120 @@ # BabelSwcLoader -The `BabelSwcLoader` combines Babel and SWC to speed up transformations while preserving compatibility with complex Babel setups. It: +The `BabelSwcLoader` pairs Babel with SWC to deliver faster builds without sacrificing compatibility with complex Babel setups. It first runs Babel to respect your project’s configuration, then hands off the supported transforms to SWC. -- Runs Babel first to apply your project Babel config (minus transforms that SWC can handle) -- Detects supported Babel transforms and re-applies them via SWC for performance -- Optionally uses SWC for module lazy loading and other optimizations +This loader can be used universally—even if your project does not have SWC. When SWC isn’t available, it cleanly falls back to pure Babel transforms, so you can adopt it incrementally without extra setup. +SWC can be provided either by Rspack (via its built-in integration) or by installing `@swc/core` in your project. -If SWC is not available in the environment, it falls back to pure Babel automatically. +:::danger Heads up! +Do not use `@callstack/repack/babel-swc-loader` together with `getJSTransformRules`. They overlap in functionality and will duplicate transforms when combined in one configuration. It might often result in code that's malformed and won't execute properly in the target mobile environment. +::: -:::details -This loader inspects your Babel config to partition transforms into SWC-supported buckets and configures `@rspack/core`/`@swc/core` accordingly. It also appends required Babel syntax plugins for `.ts/.tsx` sources. +:::tip Maximizing performance +For optimal performance, enable Rspack’s parallel transforms with [`experiments.parallelLoader`](https://rspack.rs/config/experiments#experimentsparallelloader). This allows for transformations to run in parallel through worker threads managed by Rspack. +::: + +:::details How does this loader work? +The loader reads your Babel config and checks each plugin against a capability map to see if SWC can produce the same semantics. From that, it builds two ordered sets: transforms that stay in Babel and transforms handed off to SWC. This preserves your original plugin order and avoids behavior changes. + +Babel runs first and executes only the Babel‑only pieces while adding the minimal syntax support your sources need (for example, TS/TSX and Hermes‑compatible parsing where applicable). SWC then runs on the result with a generated configuration (including targets and optional lazy imports) and applies its share of the work. Each transform is applied once—never duplicated—and the output matches what you’d get from Babel alone. + +If SWC isn’t available, the SWC step is skipped and Babel handles everything. ::: ## Options ```ts import type { TransformOptions } from "@babel/core"; -import type { SwcLoaderOptions } from "@rspack/core"; - -type HermesParserOverrides = { - babel?: boolean; - flow?: "all" | "detect"; - reactRuntimeTarget?: "18" | "19"; - sourceType?: "module" | "script" | "unambiguous"; -}; - -type HermesParserOptions = { - hermesParserPath?: string; - hermesParserOverrides?: HermesParserOverrides; -}; +import type { Options } from "@swc/core"; type BabelOverrides = TransformOptions; -type SwcOverrides = Omit; +type SwcOverrides = Options; type BabelSwcLoaderOptions = { hideParallelModeWarning?: boolean; lazyImports?: boolean | string[]; babelOverrides?: BabelOverrides; swcOverrides?: SwcOverrides; -} & HermesParserOptions; + hermesParserPath?: string; + hermesParserOverrides?: { + babel?: boolean; + flow?: "all" | "detect"; + reactRuntimeTarget?: "18" | "19"; + sourceType?: "module" | "script" | "unambiguous"; + }; +}; ``` -### hideParallelModeWarning - -- Type: `boolean` -- Default: `false` - -Hide the warning about Rspack `experiments.parallelLoader` when the rule isn't marked `parallel: true`. - ### lazyImports - Type: `boolean | string[]` - Default: `true` -Enables SWC's lazy import evaluation for faster startup. You can also provide an allowlist of module names. +Enables SWC's lazy import functionality, which is roughly equivalent to Metro's `inlineRequires`. You can also provide an allowlist of module names. See [SWC documentation](https://swc.rs/docs/configuration/modules#lazy) for details on how to configure it. ### babelOverrides -- Type: `@babel/core` `TransformOptions` +- Type: `BabelOverrides` + +```ts +type BabelOverrides = import('@babel/core').TransformOptions +``` -Additional Babel options merged into the auto-detected project config for the current file. +Additional Babel loader options applied on top of the loader's computed Babel configuration. For available fields, see [Babel Documentation](https://babeljs.io/docs/options). ### swcOverrides -- Type: `Omit` +- Type: `SwcOverrides` -Additional SWC loader options merged after the loader's computed SWC configuration. +```ts +type SwcOverrides = import('@swc/core').Options +``` -### hermesParserPath / hermesParserOverrides +Additional SWC loader options applied on top of the loader's computed SWC configuration. For available fields, see [SWC Documentation](https://swc.rs/docs/configuration/swcrc). -Same as in [`BabelLoader`](/api/loaders/babel-loader#options). +### hermesParserPath -## Behavior details +- Type: `string` -- Automatically disables source maps for `node_modules` and enables them for app sources. -- Detects Babel plugins in your project config, filters out ones supported by SWC, and re-applies them using SWC for performance. -- Always includes Babel syntax plugins for `.ts`/`.tsx` files to match React Native expectations. -- If SWC can't be resolved (via Rspack experiments or `@swc/core`), the loader uses pure Babel. +Optional path to use for importing `hermes-parser`. By default, the path is obtained automatically. -## Examples +### hermesParserOverrides -```js title=rspack.config.cjs -module.exports = { +- Type: `HermesParserOverrides` +- Default: `{ babel: true, reactRuntimeTarget: '19' }` + +Overrides passed to `hermes-parser` when parsing non-TypeScript files. + +```ts +type HermesParserOverrides = { + babel?: boolean; + flow?: "all" | "detect"; + reactRuntimeTarget?: "18" | "19"; + sourceType?: "module" | "script" | "unambiguous"; +}; +``` + +### hideParallelModeWarning + +- Type: `boolean` +- Default: `false` + +Hide the warning about Rspack `experiments.parallelLoader` when the rule isn't marked `parallel: true`. + +## Example + +```js title=rspack.config.mjs +export default { module: { rules: [ { - test: /\.[jt]sx?$/, - exclude: /node_modules/, + test: /\.[cm]?[jt]sx?$/, type: "javascript/auto", - // Optional: speed up with parallel threads in Rspack - // parallel: true, use: { loader: "@callstack/repack/babel-swc-loader", + parallel: true, options: { lazyImports: true, - babelOverrides: { - presets: ["module:metro-react-native-babel-preset"], - plugins: ["react-native-reanimated/plugin"], - }, }, }, }, @@ -106,7 +123,3 @@ module.exports = { }; ``` -:::tip -If you're already using `getJsTransformRules`, you typically don't need to add this loader manually. Use `BabelSwcLoader` if you want a hybrid Babel+SWC pipeline while keeping your existing Babel config. -::: - From 0d41639aa10a0d7adc94d0afeb9a0f8219a6d6ac Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 18 Aug 2025 20:32:26 +0200 Subject: [PATCH 60/61] chore: cleanup --- .../src/commands/common/setupEnvironment.ts | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/packages/repack/src/commands/common/setupEnvironment.ts b/packages/repack/src/commands/common/setupEnvironment.ts index 666bccaa4..cf340ee03 100644 --- a/packages/repack/src/commands/common/setupEnvironment.ts +++ b/packages/repack/src/commands/common/setupEnvironment.ts @@ -1,4 +1,3 @@ -import os from 'node:os'; import { ASSETS_DEST_ENV_KEY, BUNDLE_FILENAME_ENV_KEY, @@ -19,23 +18,9 @@ interface EnvironmentArgs { verbose?: boolean; } -const cores = os.availableParallelism(); - -function getMaxWorkers() { - return Math.max( - 1, - Math.ceil(cores * (0.5 + 0.5 * Math.exp(-cores * 0.07)) - 1) - ).toString(); -} - export function setupEnvironment(args: EnvironmentArgs): void { - const maxWorkers = getMaxWorkers(); - console.log('cpu cores / workers', cores, maxWorkers); setEnvVar(VERBOSE_ENV_KEY, args.verbose ? 'true' : undefined); setEnvVar(BUNDLE_FILENAME_ENV_KEY, args.bundleOutput); setEnvVar(SOURCEMAP_FILENAME_ENV_KEY, args.sourcemapOutput); setEnvVar(ASSETS_DEST_ENV_KEY, args.assetsDest); - // TODO: move to a more appropriate place - setEnvVar('TOKIO_WORKER_THREADS', maxWorkers); - setEnvVar('RAYON_NUM_THREADS', maxWorkers); } From 3514d375a6ded15429b25b5f86cb3d908ea5fa4c Mon Sep 17 00:00:00 2001 From: Jakub Romanczyk Date: Mon, 18 Aug 2025 20:58:16 +0200 Subject: [PATCH 61/61] chore: add changesets --- .changeset/clever-trams-grab.md | 5 +++++ .changeset/dirty-cups-pick.md | 6 ++++++ .changeset/mighty-plums-shout.md | 5 +++++ 3 files changed, 16 insertions(+) create mode 100644 .changeset/clever-trams-grab.md create mode 100644 .changeset/dirty-cups-pick.md create mode 100644 .changeset/mighty-plums-shout.md diff --git a/.changeset/clever-trams-grab.md b/.changeset/clever-trams-grab.md new file mode 100644 index 000000000..e7b7e0cd0 --- /dev/null +++ b/.changeset/clever-trams-grab.md @@ -0,0 +1,5 @@ +--- +"@callstack/repack": minor +--- + +Introduce `BabelSwcLoader`, available as `@callstack/repack/babel-swc-loader` which combines Babel and SWC into one loader, enabling Babel level of customiziability while maitaning good build performance. Can be run in parallel with `experiments.parallelLoader` in Rspack. diff --git a/.changeset/dirty-cups-pick.md b/.changeset/dirty-cups-pick.md new file mode 100644 index 000000000..c27f8cc74 --- /dev/null +++ b/.changeset/dirty-cups-pick.md @@ -0,0 +1,6 @@ +--- +"@callstack/repack-plugin-nativewind": minor +"@callstack/repack": minor +--- + +ReanimatedPlugin: skip running the loader when `babel-swc-loader` is detected as part of loader chain diff --git a/.changeset/mighty-plums-shout.md b/.changeset/mighty-plums-shout.md new file mode 100644 index 000000000..8e5ab4b7d --- /dev/null +++ b/.changeset/mighty-plums-shout.md @@ -0,0 +1,5 @@ +--- +"@callstack/repack": minor +--- + +Introduce `BabelLoader`, available as `@callstack/repack/babel-loader` which utilizes `hermes-parser` for JS & Flow files and default babel parser for TS files. Can be run in parallel with `experiments.parallelLoader` in Rspack. \ No newline at end of file