From 735a0dbd5ef852b3df02d356c657c2a5db6d5597 Mon Sep 17 00:00:00 2001 From: Daniel Williams Date: Mon, 6 Jul 2026 19:29:54 +0100 Subject: [PATCH 1/2] feat: route rspack config by major (parallelLoader, exportsPresence, profiling) Adapt the generated defaults to the installed @rspack/core major: - getRepackConfig only sets experiments.parallelLoader under Rspack 1; Rspack 2 removed the flag (parallel loading is stable and opt-in per rule via use[].parallel), so it is no longer injected there - under Rspack 2, module.parser.javascript.exportsPresence defaults to 'auto' to keep Metro-like tolerance for invalid imports inside node_modules (Rspack 2 changed the default to 'error') - checkParallelModeAvailable in babelSwcLoader skips its parallel-mode probe under Rspack 2: the probe's signal was the global flag, which no longer exists, so running non-parallel is a valid choice there rather than a misconfiguration - RSPACK_PROFILE profiling routes to a new profile-2 handler under Rspack 2 that defaults the trace layer to 'logger' (published Rspack 2 binaries do not include the perfetto layer) --- .changeset/rspack-2-config-routing.md | 9 +++ .../commands/common/config/getRepackConfig.ts | 30 +++++++- .../src/commands/rspack/profile/index.ts | 7 +- .../src/commands/rspack/profile/profile-2.ts | 68 +++++++++++++++++++ .../src/loaders/babelSwcLoader/utils.ts | 7 ++ 5 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 .changeset/rspack-2-config-routing.md create mode 100644 packages/repack/src/commands/rspack/profile/profile-2.ts diff --git a/.changeset/rspack-2-config-routing.md b/.changeset/rspack-2-config-routing.md new file mode 100644 index 000000000..99b694e91 --- /dev/null +++ b/.changeset/rspack-2-config-routing.md @@ -0,0 +1,9 @@ +--- +"@callstack/repack": patch +--- + +Route the default Rspack configuration by the installed `@rspack/core` major version: + +- `experiments.parallelLoader` is only set under Rspack 1 - Rspack 2 removed the flag (parallel loading is stable and opt-in per rule via `use[].parallel`), so it is no longer injected there +- `module.parser.javascript.exportsPresence` defaults to `'auto'` under Rspack 2 to keep Metro-like tolerance for invalid imports inside node_modules (Rspack 2 changed the default to `'error'`, which breaks builds on imports Metro tolerates; overridable in your project config) +- `RSPACK_PROFILE` profiling defaults to the `logger` trace layer under Rspack 2 (published Rspack 2 binaries do not include the perfetto layer; `RSPACK_TRACE_LAYER=perfetto` is still accepted for custom builds that enable it) diff --git a/packages/repack/src/commands/common/config/getRepackConfig.ts b/packages/repack/src/commands/common/config/getRepackConfig.ts index cc4269174..d0c306c08 100644 --- a/packages/repack/src/commands/common/config/getRepackConfig.ts +++ b/packages/repack/src/commands/common/config/getRepackConfig.ts @@ -1,8 +1,30 @@ +import { getRspackMajorVersion } from '../../../helpers/index.js'; import { getMinimizerConfig } from './getMinimizerConfig.js'; -function getExperimentsConfig(bundler: 'rspack' | 'webpack') { +function getExperimentsConfig(bundler: 'rspack' | 'webpack', rootDir: string) { if (bundler === 'rspack') { - return { parallelLoader: true }; + const rspackMajor = getRspackMajorVersion(rootDir) ?? 1; + if (rspackMajor < 2) { + return { parallelLoader: true }; + } + // Rspack 2 removed `experiments.parallelLoader` (parallel loading is + // stable and opt-in per rule via `use[].parallel`) - nothing to set. + } +} + +function getModuleConfig(bundler: 'rspack' | 'webpack', rootDir: string) { + if (bundler === 'rspack') { + const rspackMajor = getRspackMajorVersion(rootDir) ?? 1; + if (rspackMajor >= 2) { + // Rspack 2 changed the `exportsPresence` default from 'warn' to 'error', + // which breaks builds on invalid imports inside node_modules - a common + // occurrence in the React Native ecosystem that Metro tolerates. + // Restore Metro-like leniency by default; users can override this + // in their project config. + return { + parser: { javascript: { exportsPresence: 'auto' as const } }, + }; + } } } @@ -10,12 +32,14 @@ export async function getRepackConfig( bundler: 'rspack' | 'webpack', rootDir: string ) { - const experiments = getExperimentsConfig(bundler); + const experiments = getExperimentsConfig(bundler, rootDir); + const moduleConfiguration = getModuleConfig(bundler, rootDir); const minimizerConfiguration = await getMinimizerConfig(bundler, rootDir); return { devtool: 'source-map', experiments, + module: moduleConfiguration, output: { clean: true, hashFunction: 'xxhash64', diff --git a/packages/repack/src/commands/rspack/profile/index.ts b/packages/repack/src/commands/rspack/profile/index.ts index d75220b5a..3cf7dd513 100644 --- a/packages/repack/src/commands/rspack/profile/index.ts +++ b/packages/repack/src/commands/rspack/profile/index.ts @@ -9,7 +9,12 @@ function getInstalledRspackVersion() { async function getProfilingHandler() { const { major, minor } = getInstalledRspackVersion(); - if (major > 1 || (major === 1 && minor >= 4)) { + if (major >= 2) { + // Rspack 2 publishes binaries without the perfetto trace layer, + // so tracing defaults differ - see profile-2.ts + return await import('./profile-2.js'); + } + if (major === 1 && minor >= 4) { return await import('./profile-1.4.js'); } return await import('./profile-legacy.js'); diff --git a/packages/repack/src/commands/rspack/profile/profile-2.ts b/packages/repack/src/commands/rspack/profile/profile-2.ts new file mode 100644 index 000000000..0a0effae3 --- /dev/null +++ b/packages/repack/src/commands/rspack/profile/profile-2.ts @@ -0,0 +1,68 @@ +/** + * Reference: https://github.com/web-infra-dev/rspack/blob/bdfe548f4e5fd09c1ccb4d43919426819fb9a34f/packages/rspack-cli/src/utils/profile.ts + */ + +/** + * `RSPACK_PROFILE=ALL` // all trace events + * `RSPACK_PROFILE=OVERVIEW` // overview trace events + * `RSPACK_PROFILE=warn,tokio::net=info` // trace filter from https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#example-syntax + */ +import fs from 'node:fs'; +import path from 'node:path'; +import { rspack } from '@rspack/core'; + +// Rspack 2 publishes binaries built without the `perfetto` trace layer - +// requesting it throws "Perfetto trace layer is not enabled in this build". +// Default to the `logger` layer instead; `perfetto` is still accepted +// explicitly in case a custom Rspack build enables it. +const defaultRustTraceLayer = 'logger'; + +export async function applyProfile( + filterValue: string, + traceLayer: string = defaultRustTraceLayer, + traceOutput?: string +) { + const { asyncExitHook } = await import('exit-hook'); + + if (traceLayer !== 'logger' && traceLayer !== 'perfetto') { + throw new Error(`unsupported trace layer: ${traceLayer}`); + } + const timestamp = Date.now(); + const defaultOutputDir = path.resolve( + `.rspack-profile-${timestamp}-${process.pid}` + ); + if (!traceOutput) { + const defaultRustTracePerfettoOutput = path.resolve( + defaultOutputDir, + 'rspack.pftrace' + ); + const defaultRustTraceLoggerOutput = 'stdout'; + + const defaultTraceOutput = + traceLayer === 'perfetto' + ? defaultRustTracePerfettoOutput + : defaultRustTraceLoggerOutput; + + // biome-ignore lint/style/noParameterAssign: setting default value makes sense + traceOutput = defaultTraceOutput; + } else if (traceOutput !== 'stdout' && traceOutput !== 'stderr') { + // if traceOutput is not stdout or stderr, we need to ensure the directory exists + // biome-ignore lint/style/noParameterAssign: setting default value makes sense + traceOutput = path.resolve(defaultOutputDir, traceOutput); + } + + await ensureFileDir(traceOutput); + await rspack.experiments.globalTrace.register( + filterValue, + traceLayer, + traceOutput + ); + asyncExitHook(rspack.experiments.globalTrace.cleanup, { + wait: 500, + }); +} + +async function ensureFileDir(outputFilePath: string) { + const dir = path.dirname(outputFilePath); + await fs.promises.mkdir(dir, { recursive: true }); +} diff --git a/packages/repack/src/loaders/babelSwcLoader/utils.ts b/packages/repack/src/loaders/babelSwcLoader/utils.ts index bde4e504b..cf0410611 100644 --- a/packages/repack/src/loaders/babelSwcLoader/utils.ts +++ b/packages/repack/src/loaders/babelSwcLoader/utils.ts @@ -98,6 +98,13 @@ export function checkParallelModeAvailable( if (parallelModeWarningDisplayed || isWebpackBackend(loaderContext)) { return; } + // Rspack 2 removed `experiments.parallelLoader` (parallel loading is stable + // and opt-in per rule only), so there is no global flag to check against - + // running non-parallel is a valid choice there, not a misconfiguration + const rspackVersion = loaderContext._compiler?.webpack?.rspackVersion; + if (rspackVersion && Number(rspackVersion.split('.')[0]) >= 2) { + return; + } // in parallel mode compiler.options.experiments are not available // but since we're already running in parallel mode, we can ignore this check // ('in' narrowing: `parallelLoader` no longer exists in Rspack 2 types) From e4bbb7760fddd31d99138ce73497b9e8e035e840 Mon Sep 17 00:00:00 2001 From: Daniel Williams Date: Mon, 6 Jul 2026 20:30:31 +0100 Subject: [PATCH 2/2] test: cover rspack major routing in config, profiling, and loader warning Add direct assertions for the version-routing matrix introduced in this branch: - getRepackConfig: Rspack 1 emits experiments.parallelLoader, Rspack 2 omits it and relaxes module.parser.javascript.exportsPresence to 'auto', webpack gets neither and never probes the rspack version; unresolvable versions fall back to Rspack 1 behavior - profiling: the handler router picks profile-2 for major >= 2 (including prereleases), profile-1.4 for >= 1.4, legacy otherwise; profile-2 defaults to the logger trace layer, still accepts an explicit perfetto layer, and rejects unsupported layers - babelSwcLoader: the parallel-mode warning fires under Rspack 1 with a global parallelLoader flag, and is skipped under Rspack 2, webpack, and mocked parallel-mode compilers Dynamic import() cannot execute in Jest's CJS runtime without --experimental-vm-modules (which breaks other tests), so the test env now transforms dynamic imports to require via @babel/plugin-transform-dynamic-import - this also makes jest module mocks apply to lazily-imported modules. --- packages/repack/babel.config.js | 5 + packages/repack/package.json | 1 + .../config/__tests__/getRepackConfig.test.ts | 66 +++++++ .../profile/__tests__/profile-2.test.ts | 52 +++++ .../profile/__tests__/profileRouting.test.ts | 68 +++++++ .../checkParallelModeAvailable.test.ts | 97 ++++++++++ pnpm-lock.yaml | 177 +++++++++--------- 7 files changed, 379 insertions(+), 87 deletions(-) create mode 100644 packages/repack/src/commands/common/config/__tests__/getRepackConfig.test.ts create mode 100644 packages/repack/src/commands/rspack/profile/__tests__/profile-2.test.ts create mode 100644 packages/repack/src/commands/rspack/profile/__tests__/profileRouting.test.ts create mode 100644 packages/repack/src/loaders/babelSwcLoader/__tests__/checkParallelModeAvailable.test.ts diff --git a/packages/repack/babel.config.js b/packages/repack/babel.config.js index c64d92ff5..3c4834047 100644 --- a/packages/repack/babel.config.js +++ b/packages/repack/babel.config.js @@ -31,6 +31,11 @@ module.exports = { // Transform everything in `test` environment, so unit test can pass. test: { presets: [['@babel/preset-env', { targets: { node: 18 } }]], + // Jest's sandboxed CJS runtime cannot execute native `import()` without + // --experimental-vm-modules (which breaks other tests), so transform + // dynamic imports to `require` in tests - this also makes jest module + // mocks apply to lazily-imported modules. + plugins: ['@babel/plugin-transform-dynamic-import'], }, }, }; diff --git a/packages/repack/package.json b/packages/repack/package.json index af4cb615b..37d8f2b7c 100644 --- a/packages/repack/package.json +++ b/packages/repack/package.json @@ -110,6 +110,7 @@ "devDependencies": { "@babel/cli": "^7.25.2", "@babel/core": "^7.25.2", + "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.6", "@babel/plugin-transform-modules-commonjs": "^7.23.2", "@module-federation/enhanced": "0.8.9", diff --git a/packages/repack/src/commands/common/config/__tests__/getRepackConfig.test.ts b/packages/repack/src/commands/common/config/__tests__/getRepackConfig.test.ts new file mode 100644 index 000000000..25c77ffd8 --- /dev/null +++ b/packages/repack/src/commands/common/config/__tests__/getRepackConfig.test.ts @@ -0,0 +1,66 @@ +import { getRspackMajorVersion } from '../../../../helpers/index.js'; +import { getRepackConfig } from '../getRepackConfig.js'; + +jest.mock('../getMinimizerConfig.js'); +jest.mock('../../../../helpers/index.js', () => ({ + ...jest.requireActual('../../../../helpers/index.js'), + getRspackMajorVersion: jest.fn(), +})); + +const getRspackMajorVersionMock = jest.mocked(getRspackMajorVersion); + +describe('getRepackConfig', () => { + describe('rspack 1', () => { + beforeEach(() => { + getRspackMajorVersionMock.mockReturnValue(1); + }); + + it('enables experiments.parallelLoader', async () => { + const config = await getRepackConfig('rspack', '/project/root'); + expect(config.experiments).toEqual({ parallelLoader: true }); + }); + + it('does not override module parser defaults', async () => { + const config = await getRepackConfig('rspack', '/project/root'); + expect(config.module).toBeUndefined(); + }); + }); + + describe('rspack 2', () => { + beforeEach(() => { + getRspackMajorVersionMock.mockReturnValue(2); + }); + + it('omits experiments.parallelLoader (removed in Rspack 2)', async () => { + const config = await getRepackConfig('rspack', '/project/root'); + expect(config.experiments).toBeUndefined(); + }); + + it('relaxes exportsPresence to auto to keep Metro-like tolerance', async () => { + const config = await getRepackConfig('rspack', '/project/root'); + expect(config.module).toEqual({ + parser: { javascript: { exportsPresence: 'auto' } }, + }); + }); + }); + + it('falls back to rspack 1 behavior when the rspack version is unresolvable', async () => { + getRspackMajorVersionMock.mockReturnValue(null); + const config = await getRepackConfig('rspack', '/project/root'); + expect(config.experiments).toEqual({ parallelLoader: true }); + expect(config.module).toBeUndefined(); + }); + + describe('webpack', () => { + it('sets no rspack-specific experiments or module overrides', async () => { + const config = await getRepackConfig('webpack', '/project/root'); + expect(config.experiments).toBeUndefined(); + expect(config.module).toBeUndefined(); + }); + + it('never probes the installed rspack version', async () => { + await getRepackConfig('webpack', '/project/root'); + expect(getRspackMajorVersionMock).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/repack/src/commands/rspack/profile/__tests__/profile-2.test.ts b/packages/repack/src/commands/rspack/profile/__tests__/profile-2.test.ts new file mode 100644 index 000000000..006f7d503 --- /dev/null +++ b/packages/repack/src/commands/rspack/profile/__tests__/profile-2.test.ts @@ -0,0 +1,52 @@ +import fs from 'node:fs'; +import { rspack } from '@rspack/core'; +import { asyncExitHook } from 'exit-hook'; +import { applyProfile } from '../profile-2.js'; + +jest.mock('@rspack/core', () => ({ + rspack: { + experiments: { + globalTrace: { register: jest.fn(), cleanup: jest.fn() }, + }, + }, +})); +jest.mock('exit-hook', () => ({ asyncExitHook: jest.fn() })); + +const registerMock = jest.mocked(rspack.experiments.globalTrace.register); +const asyncExitHookMock = jest.mocked(asyncExitHook); + +describe('applyProfile (rspack 2)', () => { + beforeEach(() => { + // avoid creating profile output directories on disk + jest.spyOn(fs.promises, 'mkdir').mockResolvedValue(undefined); + }); + + it('defaults to the logger trace layer (perfetto is unavailable in published rspack 2 binaries)', async () => { + await applyProfile('OVERVIEW'); + expect(registerMock).toHaveBeenCalledWith('OVERVIEW', 'logger', 'stdout'); + }); + + it('still accepts an explicit perfetto trace layer for custom builds', async () => { + await applyProfile('OVERVIEW', 'perfetto'); + expect(registerMock).toHaveBeenCalledWith( + 'OVERVIEW', + 'perfetto', + expect.stringMatching(/rspack\.pftrace$/) + ); + }); + + it('rejects unsupported trace layers', async () => { + await expect(applyProfile('OVERVIEW', 'chrome')).rejects.toThrow( + 'unsupported trace layer: chrome' + ); + expect(registerMock).not.toHaveBeenCalled(); + }); + + it('registers trace cleanup to run on exit', async () => { + await applyProfile('OVERVIEW'); + expect(asyncExitHookMock).toHaveBeenCalledWith( + rspack.experiments.globalTrace.cleanup, + { wait: 500 } + ); + }); +}); diff --git a/packages/repack/src/commands/rspack/profile/__tests__/profileRouting.test.ts b/packages/repack/src/commands/rspack/profile/__tests__/profileRouting.test.ts new file mode 100644 index 000000000..9ea85ceb7 --- /dev/null +++ b/packages/repack/src/commands/rspack/profile/__tests__/profileRouting.test.ts @@ -0,0 +1,68 @@ +import { getRspackVersion } from '../../../../helpers/index.js'; +import { applyProfile } from '../index.js'; +import { applyProfile as applyProfileV1_4 } from '../profile-1.4.js'; +import { applyProfile as applyProfileV2 } from '../profile-2.js'; +import { applyProfile as applyProfileLegacy } from '../profile-legacy.js'; + +jest.mock('../../../../helpers/index.js', () => ({ + ...jest.requireActual('../../../../helpers/index.js'), + getRspackVersion: jest.fn(), +})); +jest.mock('../profile-2.js', () => ({ applyProfile: jest.fn() })); +jest.mock('../profile-1.4.js', () => ({ applyProfile: jest.fn() })); +jest.mock('../profile-legacy.js', () => ({ applyProfile: jest.fn() })); + +const getRspackVersionMock = jest.mocked(getRspackVersion); +const applyProfileV2Mock = jest.mocked(applyProfileV2); +const applyProfileV1_4Mock = jest.mocked(applyProfileV1_4); +const applyProfileLegacyMock = jest.mocked(applyProfileLegacy); + +describe('profiling handler routing', () => { + it('routes to the rspack 2 handler for rspack 2', async () => { + getRspackVersionMock.mockReturnValue('2.0.0'); + await applyProfile('OVERVIEW'); + expect(applyProfileV2Mock).toHaveBeenCalledTimes(1); + expect(applyProfileV1_4Mock).not.toHaveBeenCalled(); + expect(applyProfileLegacyMock).not.toHaveBeenCalled(); + }); + + it('routes to the rspack 2 handler for rspack 2 prereleases', async () => { + getRspackVersionMock.mockReturnValue('2.0.0-beta.3'); + await applyProfile('OVERVIEW'); + expect(applyProfileV2Mock).toHaveBeenCalledTimes(1); + }); + + it('routes to the 1.4 handler for rspack >= 1.4', async () => { + getRspackVersionMock.mockReturnValue('1.4.11'); + await applyProfile('OVERVIEW'); + expect(applyProfileV1_4Mock).toHaveBeenCalledTimes(1); + expect(applyProfileV2Mock).not.toHaveBeenCalled(); + expect(applyProfileLegacyMock).not.toHaveBeenCalled(); + }); + + it('routes to the legacy handler for rspack < 1.4', async () => { + getRspackVersionMock.mockReturnValue('1.3.9'); + await applyProfile('OVERVIEW'); + expect(applyProfileLegacyMock).toHaveBeenCalledTimes(1); + expect(applyProfileV2Mock).not.toHaveBeenCalled(); + expect(applyProfileV1_4Mock).not.toHaveBeenCalled(); + }); + + it('routes to the legacy handler when the rspack version is unresolvable', async () => { + getRspackVersionMock.mockReturnValue(null); + await applyProfile('OVERVIEW'); + expect(applyProfileLegacyMock).toHaveBeenCalledTimes(1); + expect(applyProfileV2Mock).not.toHaveBeenCalled(); + expect(applyProfileV1_4Mock).not.toHaveBeenCalled(); + }); + + it('forwards trace layer and output to the selected handler', async () => { + getRspackVersionMock.mockReturnValue('2.1.0'); + await applyProfile('OVERVIEW', 'logger', 'stderr'); + expect(applyProfileV2Mock).toHaveBeenCalledWith( + 'OVERVIEW', + 'logger', + 'stderr' + ); + }); +}); diff --git a/packages/repack/src/loaders/babelSwcLoader/__tests__/checkParallelModeAvailable.test.ts b/packages/repack/src/loaders/babelSwcLoader/__tests__/checkParallelModeAvailable.test.ts new file mode 100644 index 000000000..ef8626935 --- /dev/null +++ b/packages/repack/src/loaders/babelSwcLoader/__tests__/checkParallelModeAvailable.test.ts @@ -0,0 +1,97 @@ +// `checkParallelModeAvailable` keeps a module-level "warning already shown" +// flag, so each test re-requires a fresh copy of the module. The untyped +// `require` also lets tests pass minimal loader-context fakes without casting +// to the full Rspack `LoaderContext` interface. +type CheckParallelModeAvailable = ( + loaderContext: unknown, + logger: unknown +) => void; + +const loadCheckParallelModeAvailable = (): CheckParallelModeAvailable => { + let checkParallelModeAvailable: CheckParallelModeAvailable | undefined; + jest.isolateModules(() => { + ({ checkParallelModeAvailable } = require('../utils.js')); + }); + if (!checkParallelModeAvailable) { + throw new Error('failed to load checkParallelModeAvailable'); + } + return checkParallelModeAvailable; +}; + +const createLogger = () => ({ warn: jest.fn() }); + +const createRspackContext = ( + rspackVersion: string, + experiments: Record | undefined +) => ({ + _compiler: { + webpack: { version: '5.75.0', rspackVersion }, + options: { experiments }, + }, +}); + +describe('checkParallelModeAvailable', () => { + it('warns under rspack 1 when parallelLoader is enabled globally but not for this loader', () => { + const check = loadCheckParallelModeAvailable(); + const logger = createLogger(); + check(createRspackContext('1.5.0', { parallelLoader: true }), logger); + expect(logger.warn).toHaveBeenCalledWith( + expect.stringContaining('experiments.parallelLoader') + ); + }); + + it('warns only once', () => { + const check = loadCheckParallelModeAvailable(); + const logger = createLogger(); + check(createRspackContext('1.5.0', { parallelLoader: true }), logger); + check(createRspackContext('1.5.0', { parallelLoader: true }), logger); + expect(logger.warn).toHaveBeenCalledTimes(1); + }); + + it('does not warn under rspack 1 when parallelLoader is not enabled', () => { + const check = loadCheckParallelModeAvailable(); + const logger = createLogger(); + check(createRspackContext('1.5.0', {}), logger); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('does not warn under rspack 2 (parallelLoader global flag no longer exists)', () => { + const check = loadCheckParallelModeAvailable(); + const logger = createLogger(); + // even with a leftover parallelLoader flag in the config, the version + // gate skips the check - running non-parallel is valid under rspack 2 + check(createRspackContext('2.0.0', { parallelLoader: true }), logger); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('does not warn under rspack 2 prereleases', () => { + const check = loadCheckParallelModeAvailable(); + const logger = createLogger(); + check( + createRspackContext('2.0.0-beta.1', { parallelLoader: true }), + logger + ); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('does not warn on webpack', () => { + const check = loadCheckParallelModeAvailable(); + const logger = createLogger(); + const webpackContext = { + _compiler: { + webpack: { version: '5.75.0' }, + options: { experiments: { parallelLoader: true } }, + }, + }; + check(webpackContext, logger); + expect(logger.warn).not.toHaveBeenCalled(); + }); + + it('does not warn in parallel mode where the compiler is mocked', () => { + const check = loadCheckParallelModeAvailable(); + const logger = createLogger(); + // in parallel mode the compiler object is mocked without most props + check({ _compiler: { webpack: {} } }, logger); + expect(logger.warn).not.toHaveBeenCalled(); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4fa9a1a9d..b9041138a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -659,6 +659,9 @@ importers: '@babel/core': specifier: ^7.25.2 version: 7.25.2 + '@babel/plugin-transform-dynamic-import': + specifier: ^7.24.7 + version: 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-export-namespace-from': specifier: ^7.24.6 version: 7.24.7(@babel/core@7.25.2) @@ -9022,7 +9025,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.8 @@ -9166,7 +9169,7 @@ snapshots: '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -9174,17 +9177,17 @@ snapshots: '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) transitivePeerDependencies: @@ -9193,7 +9196,7 @@ snapshots: '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -9201,7 +9204,7 @@ snapshots: '@babel/plugin-proposal-export-default-from@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-default-from': 7.24.7(@babel/core@7.25.2) '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2)': @@ -9211,37 +9214,37 @@ snapshots: '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-default-from@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2)': dependencies: @@ -9251,27 +9254,27 @@ snapshots: '@babel/plugin-syntax-import-assertions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.25.2)': dependencies: @@ -9281,47 +9284,47 @@ snapshots: '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-typescript@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-typescript@7.28.6(@babel/core@7.25.2)': dependencies: @@ -9332,12 +9335,12 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.25.2)': dependencies: @@ -9347,7 +9350,7 @@ snapshots: '@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) '@babel/traverse': 7.29.0 @@ -9358,7 +9361,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -9366,18 +9369,18 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -9393,7 +9396,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -9403,7 +9406,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) '@babel/traverse': 7.29.0 globals: 11.12.0 @@ -9425,42 +9428,42 @@ snapshots: '@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/template': 7.28.6 '@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) '@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -9473,13 +9476,13 @@ snapshots: '@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color @@ -9488,7 +9491,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/traverse': 7.29.0 transitivePeerDependencies: - supports-color @@ -9496,30 +9499,30 @@ snapshots: '@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) '@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) '@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -9544,7 +9547,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.29.0 transitivePeerDependencies: @@ -9554,7 +9557,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -9562,17 +9565,17 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.25.2)': @@ -9583,21 +9586,21 @@ snapshots: '@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) '@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -9605,13 +9608,13 @@ snapshots: '@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) '@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) transitivePeerDependencies: @@ -9628,13 +9631,13 @@ snapshots: '@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -9643,7 +9646,7 @@ snapshots: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color @@ -9651,17 +9654,17 @@ snapshots: '@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-constant-elements@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-development@7.24.7(@babel/core@7.25.2)': dependencies: @@ -9673,12 +9676,12 @@ snapshots: '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2)': dependencies: @@ -9695,24 +9698,24 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 regenerator-transform: 0.15.2 '@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-runtime@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) @@ -9723,7 +9726,7 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.25.2)': dependencies: @@ -9733,7 +9736,7 @@ snapshots: '@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color @@ -9741,12 +9744,12 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.25.2)': dependencies: @@ -9756,14 +9759,14 @@ snapshots: '@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-typescript@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 '@babel/plugin-syntax-typescript': 7.25.4(@babel/core@7.25.2) transitivePeerDependencies: @@ -9783,19 +9786,19 @@ snapshots: '@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.25.2)': dependencies: @@ -9807,7 +9810,7 @@ snapshots: dependencies: '@babel/core': 7.25.2 '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/preset-env@7.25.4(@babel/core@7.25.2)': dependencies: @@ -9901,14 +9904,14 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/types': 7.29.0 esutils: 2.0.3 '@babel/preset-react@7.24.7(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.24.8 '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) @@ -13448,7 +13451,7 @@ snapshots: babel-plugin-istanbul@6.1.1: dependencies: - '@babel/helper-plugin-utils': 7.24.8 + '@babel/helper-plugin-utils': 7.28.6 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1