diff --git a/.changeset/rspack-2-node-guard.md b/.changeset/rspack-2-node-guard.md new file mode 100644 index 000000000..60465c312 --- /dev/null +++ b/.changeset/rspack-2-node-guard.md @@ -0,0 +1,5 @@ +--- +"@callstack/repack": patch +--- + +Raise a clear error when running the Rspack-based commands with Rspack 2 on Node.js older than 20.19 (Rspack 2 requires Node `^20.19.0 || >=22.12.0`), instead of failing with `ERR_REQUIRE_ESM`. Rspack commands are now loaded lazily so the version check runs before `@rspack/core` is touched. diff --git a/packages/repack/babel.config.js b/packages/repack/babel.config.js index c64d92ff5..aa23bd69b 100644 --- a/packages/repack/babel.config.js +++ b/packages/repack/babel.config.js @@ -31,6 +31,10 @@ module.exports = { // Transform everything in `test` environment, so unit test can pass. test: { presets: [['@babel/preset-env', { targets: { node: 18 } }]], + // The build keeps `import(...)` untransformed (see the override above), + // but Jest runs modules as CJS, so tests need `import(...)` lowered + // to `require(...)` as well. + plugins: ['@babel/plugin-transform-dynamic-import'], }, }, }; diff --git a/packages/repack/package.json b/packages/repack/package.json index da0b7402c..34d183dd5 100644 --- a/packages/repack/package.json +++ b/packages/repack/package.json @@ -109,6 +109,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/rspack/__tests__/commandsModuleLoad.test.ts b/packages/repack/src/commands/rspack/__tests__/commandsModuleLoad.test.ts new file mode 100644 index 000000000..908816a92 --- /dev/null +++ b/packages/repack/src/commands/rspack/__tests__/commandsModuleLoad.test.ts @@ -0,0 +1,32 @@ +// Loading '@rspack/core' at require time would crash with ERR_REQUIRE_ESM +// on Node versions unsupported by Rspack 2, before the Node compatibility +// guard has a chance to run. This mock turns any eager load into a test +// failure. Note that bundle.js/start.js are deliberately NOT mocked here, +// so this fails if the commands module ever imports them eagerly again. +jest.mock('@rspack/core', () => { + throw new Error( + '@rspack/core must not be loaded when the rspack commands module is imported' + ); +}); + +describe('rspack commands module', () => { + it('registers commands without loading @rspack/core', () => { + expect(() => require('../index.js')).not.toThrow(); + }); + + it('exposes the expected commands', () => { + const commands: typeof import('../index.js').default = + require('../index.js').default; + + expect(commands.map((command) => command.name)).toEqual([ + 'bundle', + 'webpack-bundle', + 'start', + 'webpack-start', + ]); + + for (const command of commands) { + expect(typeof command.func).toBe('function'); + } + }); +}); diff --git a/packages/repack/src/commands/rspack/__tests__/ensureNodeCompat.test.ts b/packages/repack/src/commands/rspack/__tests__/ensureNodeCompat.test.ts new file mode 100644 index 000000000..548f542a6 --- /dev/null +++ b/packages/repack/src/commands/rspack/__tests__/ensureNodeCompat.test.ts @@ -0,0 +1,72 @@ +import { CLIError, getRspackVersion } from '../../../helpers/index.js'; +import { ensureNodeSupportsRspack } from '../ensureNodeCompat.js'; + +jest.mock('../../../helpers/index.js', () => ({ + ...jest.requireActual( + '../../../helpers/index.js' + ), + getRspackVersion: jest.fn(), +})); + +const getRspackVersionMock = jest.mocked(getRspackVersion); + +// `process.versions.node` is a read-only property, so it cannot be +// mocked with `jest.replaceProperty` - redefine it manually instead. +const originalNodeVersion = Object.getOwnPropertyDescriptor( + process.versions, + 'node' +); + +const setup = (rspackVersion: string | null, nodeVersion: string) => { + getRspackVersionMock.mockReturnValue(rspackVersion); + Object.defineProperty(process.versions, 'node', { + value: nodeVersion, + configurable: true, + }); +}; + +afterAll(() => { + if (originalNodeVersion) { + Object.defineProperty(process.versions, 'node', originalNodeVersion); + } +}); + +describe('ensureNodeSupportsRspack', () => { + it('does nothing when @rspack/core is not resolvable', () => { + setup(null, '18.20.0'); + expect(() => ensureNodeSupportsRspack()).not.toThrow(); + }); + + it('does nothing for Rspack 1.x regardless of Node version', () => { + setup('1.5.8', '18.20.0'); + expect(() => ensureNodeSupportsRspack()).not.toThrow(); + }); + + it.each(['18.20.0', '20.18.3', '21.7.3', '22.11.0'])( + 'throws CLIError for Rspack 2 on unsupported Node %s', + (nodeVersion) => { + setup('2.0.0', nodeVersion); + expect(() => ensureNodeSupportsRspack()).toThrow(CLIError); + } + ); + + it.each(['20.19.0', '20.19.4', '22.12.0', '24.0.0'])( + 'does nothing for Rspack 2 on supported Node %s', + (nodeVersion) => { + setup('2.0.0', nodeVersion); + expect(() => ensureNodeSupportsRspack()).not.toThrow(); + } + ); + + it('treats prerelease Rspack 2 versions as Rspack 2', () => { + setup('2.0.0-beta.1', '18.20.0'); + expect(() => ensureNodeSupportsRspack()).toThrow(CLIError); + }); + + it('reports both the Rspack and Node versions in the error', () => { + setup('2.0.0', '18.20.0'); + expect(() => ensureNodeSupportsRspack()).toThrow( + /Rspack 2\.0\.0 requires Node\.js .+ found 18\.20\.0/ + ); + }); +}); diff --git a/packages/repack/src/commands/rspack/__tests__/lazyCommands.test.ts b/packages/repack/src/commands/rspack/__tests__/lazyCommands.test.ts new file mode 100644 index 000000000..03fde5adf --- /dev/null +++ b/packages/repack/src/commands/rspack/__tests__/lazyCommands.test.ts @@ -0,0 +1,94 @@ +import type { + BundleArguments, + CliConfig, + StartArguments, +} from '../../types.js'; +import { bundle } from '../bundle.js'; +import { ensureNodeSupportsRspack } from '../ensureNodeCompat.js'; +import commands from '../index.js'; +import { start } from '../start.js'; + +// safety net: any code path that loads '@rspack/core' fails loudly +jest.mock('@rspack/core', () => { + throw new Error( + '@rspack/core must not be loaded before the Node compatibility guard runs' + ); +}); + +jest.mock('../ensureNodeCompat.js', () => ({ + ensureNodeSupportsRspack: jest.fn(), +})); +jest.mock('../bundle.js', () => ({ bundle: jest.fn() })); +jest.mock('../start.js', () => ({ start: jest.fn() })); + +const guardMock = jest.mocked(ensureNodeSupportsRspack); +const bundleMock = jest.mocked(bundle); +const startMock = jest.mocked(start); + +const [bundleCommand, webpackBundleCommand, startCommand, webpackStartCommand] = + commands; + +const cliConfig: CliConfig = { + root: '/project', + platforms: ['ios', 'android'], + reactNativePath: '/project/node_modules/react-native', +}; + +const bundleArgs: BundleArguments = { platform: 'ios', dev: true }; +const startArgs: StartArguments = { host: '' }; + +describe('lazy rspack commands', () => { + it.each([ + ['bundle', bundleCommand], + ['webpack-bundle', webpackBundleCommand], + ] as const)( + '%s runs the Node compatibility guard before delegating to bundle', + async (_name, command) => { + await command.func([], cliConfig, bundleArgs); + + expect(guardMock).toHaveBeenCalledTimes(1); + expect(bundleMock).toHaveBeenCalledWith([], cliConfig, bundleArgs); + expect(guardMock.mock.invocationCallOrder[0]).toBeLessThan( + bundleMock.mock.invocationCallOrder[0] + ); + } + ); + + it.each([ + ['start', startCommand], + ['webpack-start', webpackStartCommand], + ] as const)( + '%s runs the Node compatibility guard before delegating to start', + async (_name, command) => { + await command.func([], cliConfig, startArgs); + + expect(guardMock).toHaveBeenCalledTimes(1); + expect(startMock).toHaveBeenCalledWith([], cliConfig, startArgs); + expect(guardMock.mock.invocationCallOrder[0]).toBeLessThan( + startMock.mock.invocationCallOrder[0] + ); + } + ); + + it('does not run bundle when the guard throws', async () => { + guardMock.mockImplementationOnce(() => { + throw new Error('Rspack 2.0.0 requires Node.js ^20.19.0 || >=22.12.0'); + }); + + await expect(bundleCommand.func([], cliConfig, bundleArgs)).rejects.toThrow( + 'Rspack 2.0.0 requires Node.js' + ); + expect(bundleMock).not.toHaveBeenCalled(); + }); + + it('does not run start when the guard throws', async () => { + guardMock.mockImplementationOnce(() => { + throw new Error('Rspack 2.0.0 requires Node.js ^20.19.0 || >=22.12.0'); + }); + + await expect(startCommand.func([], cliConfig, startArgs)).rejects.toThrow( + 'Rspack 2.0.0 requires Node.js' + ); + expect(startMock).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/repack/src/commands/rspack/ensureNodeCompat.ts b/packages/repack/src/commands/rspack/ensureNodeCompat.ts new file mode 100644 index 000000000..f17d30704 --- /dev/null +++ b/packages/repack/src/commands/rspack/ensureNodeCompat.ts @@ -0,0 +1,31 @@ +import semver from 'semver'; +import { CLIError, getRspackVersion } from '../../helpers/index.js'; + +// Rspack 2 is published as a pure ESM package and declares +// engines.node: "^20.19.0 || >=22.12.0" - the versions where +// loading ESM through require() is supported. +const RSPACK_2_NODE_RANGE = '^20.19.0 || >=22.12.0'; + +/** + * Fails fast with an actionable error when the installed Rspack major + * requires a newer Node.js version than the current one. + * + * Without this guard, loading `@rspack/core` v2 on an unsupported Node + * version crashes with an obscure `ERR_REQUIRE_ESM` error. + */ +export function ensureNodeSupportsRspack() { + const rspackVersion = getRspackVersion(); + + // not resolvable - let the import of '@rspack/core' surface its own error + if (!rspackVersion) return; + + if (semver.major(semver.coerce(rspackVersion) ?? '0.0.0') < 2) return; + + if (semver.satisfies(process.versions.node, RSPACK_2_NODE_RANGE)) return; + + throw new CLIError( + `Rspack ${rspackVersion} requires Node.js ^20.19.0 || >=22.12.0 - ` + + `found ${process.versions.node}. ` + + 'Upgrade Node.js or use @rspack/core@1 instead.' + ); +} diff --git a/packages/repack/src/commands/rspack/index.ts b/packages/repack/src/commands/rspack/index.ts index 7db45a291..6161d7bb7 100644 --- a/packages/repack/src/commands/rspack/index.ts +++ b/packages/repack/src/commands/rspack/index.ts @@ -1,31 +1,50 @@ import { bundleCommandOptions, startCommandOptions } from '../options.js'; -import { bundle } from './bundle.js'; -import { start } from './start.js'; + +import type { bundle } from './bundle.js'; +import type { start } from './start.js'; + +// The command modules load '@rspack/core' which is ESM-only in Rspack 2, +// so they are imported lazily: first the Node version guard runs and turns +// an unsupported setup into an actionable error instead of ERR_REQUIRE_ESM, +// and loading the project config stays free of bundler imports. +const lazyBundle = async (...args: Parameters) => { + const { ensureNodeSupportsRspack } = await import('./ensureNodeCompat.js'); + ensureNodeSupportsRspack(); + const { bundle } = await import('./bundle.js'); + return bundle(...args); +}; + +const lazyStart = async (...args: Parameters) => { + const { ensureNodeSupportsRspack } = await import('./ensureNodeCompat.js'); + ensureNodeSupportsRspack(); + const { start } = await import('./start.js'); + return start(...args); +}; const commands = [ { name: 'bundle', description: 'Build the bundle for the provided JavaScript entry file.', options: bundleCommandOptions, - func: bundle, + func: lazyBundle, }, { name: 'webpack-bundle', description: 'Build the bundle for the provided JavaScript entry file.', options: bundleCommandOptions, - func: bundle, + func: lazyBundle, }, { name: 'start', description: 'Start the React Native development server.', options: startCommandOptions, - func: start, + func: lazyStart, }, { name: 'webpack-start', description: 'Start the React Native development server.', options: startCommandOptions, - func: start, + func: lazyStart, }, ] as const; diff --git a/packages/repack/src/commands/rspack/profile/index.ts b/packages/repack/src/commands/rspack/profile/index.ts index ca88f0856..d75220b5a 100644 --- a/packages/repack/src/commands/rspack/profile/index.ts +++ b/packages/repack/src/commands/rspack/profile/index.ts @@ -1,14 +1,14 @@ -import { rspackVersion } from '@rspack/core'; +import { getRspackVersion } from '../../../helpers/index.js'; -function getRspackVersion() { +function getInstalledRspackVersion() { // get rid of `-beta`, `-rc` etc. - const version = rspackVersion.split('-')[0]; + const version = (getRspackVersion() ?? '0.0.0').split('-')[0]; const [major, minor, patch] = version.split('.').map(Number); return { major, minor, patch }; } async function getProfilingHandler() { - const { major, minor } = getRspackVersion(); + const { major, minor } = getInstalledRspackVersion(); if (major > 1 || (major === 1 && minor >= 4)) { return await import('./profile-1.4.js'); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index af1b6547c..3343efdc7 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) @@ -8827,7 +8830,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 @@ -8971,7 +8974,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 @@ -8979,17 +8982,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: @@ -8998,7 +9001,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 @@ -9006,7 +9009,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)': @@ -9016,37 +9019,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: @@ -9056,22 +9059,22 @@ 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: @@ -9086,47 +9089,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: @@ -9137,12 +9140,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: @@ -9152,7 +9155,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 @@ -9163,7 +9166,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 @@ -9171,18 +9174,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 @@ -9198,7 +9201,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 @@ -9208,7 +9211,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 @@ -9230,42 +9233,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 @@ -9278,13 +9281,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 @@ -9293,7 +9296,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 @@ -9301,30 +9304,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 @@ -9349,7 +9352,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: @@ -9359,7 +9362,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 @@ -9367,17 +9370,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)': @@ -9388,21 +9391,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 @@ -9410,13 +9413,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: @@ -9433,13 +9436,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 @@ -9448,7 +9451,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 @@ -9456,17 +9459,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: @@ -9478,12 +9481,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: @@ -9500,24 +9503,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) @@ -9528,7 +9531,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: @@ -9538,7 +9541,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 @@ -9546,12 +9549,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: @@ -9561,14 +9564,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: @@ -9588,19 +9591,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: @@ -9612,7 +9615,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: @@ -9706,14 +9709,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) @@ -13073,7 +13076,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