From 451f561410d4e4f5604df94815e9f85812966b3a Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Wed, 17 Jun 2026 15:23:47 -0400 Subject: [PATCH 1/3] feat: enable mui/no-floating-cleanup and fix flagged leaks Adopt the new `mui/no-floating-cleanup` rule (mui/mui-public#1538), which flags call statements whose returned cleanup/unsubscribe is discarded, and resolve everything it reports. - Bump `@mui/internal-code-infra` to 0.0.4-canary.66 (first version with the rule); enable it on `packages/*/src` via `projectService`. - Real leaks fixed: - Return the unsubscribe from effects (`MoreEventsPopover`, `useKeepGroupedColumnsHidden`). - Register the scheduler stores' dev-assertion subscriptions on their `DisposableStack`. - Migrate the Tree View store to `useDisposable`; its subscriptions, `EventManager` and `TimeoutManager` are now torn down on unmount. The mount-time side effect (lazy-loading init) moves from the old `disposeEffect` to a dedicated `mountEffect`. - Intentional non-leak discards annotated with `void` (d3 builder, callback-ref forwarding, `markChatLayoutPane` in-place mutation). - Excluded `x-codemod` (AST transforms) and the vendored `base-ui-copy`. - Two Data Grid cases left as `void` + `FIXME` pending a behavior decision (see inline comments): `useGridRowSelection` no-op effect and `useGridRegisterStrategyProcessor` discarded unregister. Co-Authored-By: Claude Opus 4.8 --- eslint.config.mjs | 28 ++- package.json | 2 +- .../src/internals/scales/scaleBand.ts | 4 +- packages/x-chat/src/ChatBox/ChatBox.tsx | 3 +- .../x-chat/src/ChatBox/ChatBoxContent.tsx | 5 +- .../src/ChatConversation/ChatConversation.tsx | 4 +- .../ChatConversationList.tsx | 3 +- .../x-chat/src/internals/mergeSlotProps.ts | 3 +- .../utils/useKeepGroupedColumnsHidden.ts | 2 +- .../useGridRegisterStrategyProcessor.ts | 6 +- .../rowSelection/useGridRowSelection.ts | 6 +- .../EventTimelinePremiumStore.ts | 10 +- .../use-event-calendar/EventCalendarStore.ts | 10 +- .../more-events-popover/MoreEventsPopover.tsx | 2 +- .../RichTreeViewProStore.ts | 3 +- .../MinimalTreeViewStore.ts | 64 +++++-- .../TreeViewProvider.types.ts | 5 +- .../src/internals/hooks/useTreeViewStore.ts | 8 +- .../plugins/focus/TreeViewFocusPlugin.ts | 56 +++--- pnpm-lock.yaml | 172 ++++++++++++------ 20 files changed, 272 insertions(+), 124 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 302bcec4d3a74..49c513913cf76 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -294,7 +294,7 @@ export default defineConfig( languageOptions: { parserOptions: { tsconfigRootDir: dirname, - project: ['./tsconfig.json'], + projectService: true, }, }, }, @@ -335,6 +335,32 @@ export default defineConfig( }, }, + // Catch leaked subscriptions: call statements whose returned cleanup / + // unsubscribe function is discarded. Type-aware, so it needs TypeScript type + // information (same `projectService` setup as `mui-x/no-direct-state-access` above). + { + files: [`packages/*/src/**/*${EXTENSION_TS}`], + ignores: [ + '**/*.d.ts', + `**/*.spec${EXTENSION_TS}`, + `**/*.test${EXTENSION_TS}`, + // Codemods are jscodeshift AST transforms with no runtime subscriptions; + // the only hits are chai assertions in a test-style file. + 'packages/x-codemod/**', + // Vendored copy of Base UI internals — keep in sync with upstream, don't edit. + 'packages/x-scheduler-internals/src/base-ui-copy/**', + ], + languageOptions: { + parserOptions: { + tsconfigRootDir: dirname, + projectService: true, + }, + }, + rules: { + 'mui/no-floating-cleanup': 'error', + }, + }, + // Common config from core start { files: [`docs/**/*${EXTENSION_TS}`], diff --git a/package.json b/package.json index 4b134643cbd64..e5ebd094b40bc 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "@mui/internal-babel-plugin-display-name": "1.0.4-canary.20", "@mui/internal-babel-plugin-minify-errors": "2.0.8-canary.27", "@mui/internal-bundle-size-checker": "1.0.9-canary.81", - "@mui/internal-code-infra": "0.0.4-canary.64", + "@mui/internal-code-infra": "0.0.4-canary.66", "@mui/internal-api-docs-builder": "1.0.2-canary.2", "@mui/internal-markdown": "3.0.9-canary.2", "@mui/internal-netlify-cache": "0.0.3-canary.5", diff --git a/packages/x-charts/src/internals/scales/scaleBand.ts b/packages/x-charts/src/internals/scales/scaleBand.ts index 6953f8d2907d5..f9cdb6b21b056 100644 --- a/packages/x-charts/src/internals/scales/scaleBand.ts +++ b/packages/x-charts/src/internals/scales/scaleBand.ts @@ -169,7 +169,9 @@ function createScaleBand(seed?: ScaleBandState): ScaleBand { scale.copy = () => createScaleBand({ index, domain, r0, r1, isRound, paddingInner, paddingOuter, align }); - rescale(); + // `rescale` returns the scale for the fluent setters; here it only seeds the + // initial layout, so the (callable) return is intentionally discarded. + void rescale(); return scale as any; } diff --git a/packages/x-chat/src/ChatBox/ChatBox.tsx b/packages/x-chat/src/ChatBox/ChatBox.tsx index c2baa83d0c2ef..20ec7f74935d7 100644 --- a/packages/x-chat/src/ChatBox/ChatBox.tsx +++ b/packages/x-chat/src/ChatBox/ChatBox.tsx @@ -113,7 +113,8 @@ const ChatBox = React.forwardRef(function ChatBox( (node: HTMLDivElement | null) => { setRootElement(node); if (typeof ref === 'function') { - ref(node); + // Legacy callback-ref forwarding; a React 19 cleanup return is not propagated here. + void ref(node); } else if (ref) { (ref as React.MutableRefObject).current = node; } diff --git a/packages/x-chat/src/ChatBox/ChatBoxContent.tsx b/packages/x-chat/src/ChatBox/ChatBoxContent.tsx index 8d18d1fc94709..7b4de62613f70 100644 --- a/packages/x-chat/src/ChatBox/ChatBoxContent.tsx +++ b/packages/x-chat/src/ChatBox/ChatBoxContent.tsx @@ -206,7 +206,8 @@ const ChatBoxConversationOverlay = styled('div', { // conversations pane. Marking it keeps ChatLayout's pane resolution unambiguous — // once any sibling (the thread view) is marked, every direct child must be marked // or ChatLayout warns about a mixed/undeterminable set. -markChatLayoutPane(ChatBoxConversationOverlay, 'conversations'); +// `markChatLayoutPane` mutates the component in place and returns it; the return is discarded here. +void markChatLayoutPane(ChatBoxConversationOverlay, 'conversations'); const ChatBoxConversationOverlayBackdrop = styled('div', { name: 'MuiChatBox', @@ -632,7 +633,7 @@ function createMarkedConversationListComponent( return ; }, ); - markChatLayoutPane(MarkedConversationList, 'conversations'); + void markChatLayoutPane(MarkedConversationList, 'conversations'); return MarkedConversationList as typeof ChatConversationList; } diff --git a/packages/x-chat/src/ChatConversation/ChatConversation.tsx b/packages/x-chat/src/ChatConversation/ChatConversation.tsx index 6456696a4c58d..0981293ceb951 100644 --- a/packages/x-chat/src/ChatConversation/ChatConversation.tsx +++ b/packages/x-chat/src/ChatConversation/ChatConversation.tsx @@ -85,6 +85,8 @@ ChatConversation.propTypes /* remove-proptypes */ = { // Mirror the headless `ConversationRoot` pane marker on the Material wrapper so // `ChatLayout` assigns it to the thread pane (the symbol lives on the headless // primitive, not this wrapper). -markChatLayoutPane(ChatConversation, 'thread'); +// `markChatLayoutPane` mutates the component in place and returns it for the +// `const X = markChatLayoutPane(...)` form; here the return is intentionally discarded. +void markChatLayoutPane(ChatConversation, 'thread'); export { ChatConversation }; diff --git a/packages/x-chat/src/ChatConversationList/ChatConversationList.tsx b/packages/x-chat/src/ChatConversationList/ChatConversationList.tsx index 62b1fbc5f4e4f..0bdfe493c6a61 100644 --- a/packages/x-chat/src/ChatConversationList/ChatConversationList.tsx +++ b/packages/x-chat/src/ChatConversationList/ChatConversationList.tsx @@ -820,6 +820,7 @@ ChatConversationList.propTypes /* remove-proptypes */ = { // primitive, not this wrapper). Without it, a split layout with the list visible and // no active conversation — a single unmarked child — falls back to the thread pane, // skipping the `conversationsPane` slot/styles. -markChatLayoutPane(ChatConversationList, 'conversations'); +// `markChatLayoutPane` mutates the component in place and returns it; the return is discarded here. +void markChatLayoutPane(ChatConversationList, 'conversations'); export { ChatConversationList }; diff --git a/packages/x-chat/src/internals/mergeSlotProps.ts b/packages/x-chat/src/internals/mergeSlotProps.ts index a9f9b57f4ee10..7f1d104a2304e 100644 --- a/packages/x-chat/src/internals/mergeSlotProps.ts +++ b/packages/x-chat/src/internals/mergeSlotProps.ts @@ -17,7 +17,8 @@ function setRef(ref: React.Ref, value: unknown) { return; } if (typeof ref === 'function') { - ref(value); + // Legacy callback-ref forwarding; a React 19 cleanup return is not propagated here. + void ref(value); return; } diff --git a/packages/x-data-grid-premium/src/hooks/utils/useKeepGroupedColumnsHidden.ts b/packages/x-data-grid-premium/src/hooks/utils/useKeepGroupedColumnsHidden.ts index db1cf74d34fb4..9cd31247a4192 100644 --- a/packages/x-data-grid-premium/src/hooks/utils/useKeepGroupedColumnsHidden.ts +++ b/packages/x-data-grid-premium/src/hooks/utils/useKeepGroupedColumnsHidden.ts @@ -47,7 +47,7 @@ export const useKeepGroupedColumnsHidden = ( ); React.useEffect(() => { - props.apiRef.current?.subscribeEvent('rowGroupingModelChange', (newModel) => { + return props.apiRef.current?.subscribeEvent('rowGroupingModelChange', (newModel) => { const columnVisibilityModel = updateColumnVisibilityModel( gridColumnVisibilityModelSelector(props.apiRef), newModel, diff --git a/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts b/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts index 2b5deed922fa2..59fb6ac96ca23 100644 --- a/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts +++ b/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts @@ -15,7 +15,11 @@ export const useGridRegisterStrategyProcessor = < processor: GridStrategyProcessor, ) => { const registerPreProcessor = React.useCallback(() => { - apiRef.current.registerStrategyProcessor(strategyName, group, processor); + // FIXME: the unregister fn is discarded — unlike `useGridRegisterPipeProcessor`, + // which stores and calls it. Strategy processors currently must outlive the + // component: tearing one down on unmount breaks strategy resolution (e.g. + // "No processor found" on tree-data filtering/sorting). `void` until resolved. + void apiRef.current.registerStrategyProcessor(strategyName, group, processor); }, [apiRef, processor, group, strategyName]); useFirstRender(() => { diff --git a/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts b/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts index 96e15fb547100..6f7dbe0bdca6f 100644 --- a/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts +++ b/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts @@ -961,7 +961,11 @@ You need to upgrade to DataGridPro or DataGridPremium component to unlock multip }, [apiRef, canHaveMultipleSelection, checkboxSelection, isStateControlled, props.rowSelection]); React.useEffect(() => { - runIf(props.rowSelection, removeOutdatedSelection); + // FIXME: no-op since #20668. `runIf` is curried, so this builds a wrapper and + // discards it (previously `runIfRowSelectionIsEnabled(removeOutdatedSelection)`, + // which invoked it). Restoring the call changes selection behavior, so it needs + // a decision; `void` preserves current behavior. See #20668. + void runIf(props.rowSelection, removeOutdatedSelection); }, [props.rowSelection, removeOutdatedSelection]); React.useEffect(() => { diff --git a/packages/x-scheduler-internals-premium/src/use-event-timeline-premium/EventTimelinePremiumStore.ts b/packages/x-scheduler-internals-premium/src/use-event-timeline-premium/EventTimelinePremiumStore.ts index 6f918d650f251..7700ae079c37a 100644 --- a/packages/x-scheduler-internals-premium/src/use-event-timeline-premium/EventTimelinePremiumStore.ts +++ b/packages/x-scheduler-internals-premium/src/use-event-timeline-premium/EventTimelinePremiumStore.ts @@ -140,10 +140,12 @@ export class EventTimelinePremiumStore< if (process.env.NODE_ENV !== 'production') { // Assert the initial state validity; `subscribe` only fires on subsequent state changes. this.assertPresetValidity(this.state.preset); - this.subscribe((state) => { - this.assertPresetValidity(state.preset); - return null; - }); + this.disposables.defer( + this.subscribe((state) => { + this.assertPresetValidity(state.preset); + return null; + }), + ); } this.lazyLoading = this.disposables.use(new EventTimelinePremiumLazyLoadingPlugin(this)); diff --git a/packages/x-scheduler-internals/src/use-event-calendar/EventCalendarStore.ts b/packages/x-scheduler-internals/src/use-event-calendar/EventCalendarStore.ts index b262dc403f5a5..7fac489eb1c1c 100644 --- a/packages/x-scheduler-internals/src/use-event-calendar/EventCalendarStore.ts +++ b/packages/x-scheduler-internals/src/use-event-calendar/EventCalendarStore.ts @@ -132,10 +132,12 @@ export class ExtendableEventCalendarStore< if (process.env.NODE_ENV !== 'production') { // Assert the initial state validity; `subscribe` only fires on subsequent state changes. this.assertViewValidity(this.state.view); - this.subscribe((state) => { - this.assertViewValidity(state.view); - return null; - }); + this.disposables.defer( + this.subscribe((state) => { + this.assertViewValidity(state.view); + return null; + }), + ); } } diff --git a/packages/x-scheduler/src/internals/components/more-events-popover/MoreEventsPopover.tsx b/packages/x-scheduler/src/internals/components/more-events-popover/MoreEventsPopover.tsx index f98e39db1f5d4..c3a6e5e623170 100644 --- a/packages/x-scheduler/src/internals/components/more-events-popover/MoreEventsPopover.tsx +++ b/packages/x-scheduler/src/internals/components/more-events-popover/MoreEventsPopover.tsx @@ -70,7 +70,7 @@ export default function MoreEventsPopoverContent(props: MoreEventsPopoverProps) const { subscribeCloseHandler } = useEventDialogContext(); React.useEffect(() => { - subscribeCloseHandler(() => { + return subscribeCloseHandler(() => { onClose(); }); }, [subscribeCloseHandler, onClose]); diff --git a/packages/x-tree-view-pro/src/internals/RichTreeViewProStore/RichTreeViewProStore.ts b/packages/x-tree-view-pro/src/internals/RichTreeViewProStore/RichTreeViewProStore.ts index 5beb295bcbb94..936b6fbf50f6e 100644 --- a/packages/x-tree-view-pro/src/internals/RichTreeViewProStore/RichTreeViewProStore.ts +++ b/packages/x-tree-view-pro/src/internals/RichTreeViewProStore/RichTreeViewProStore.ts @@ -18,9 +18,8 @@ export class RichTreeViewProStore< public itemsReordering = new TreeViewItemsReorderingPlugin(this); - public disposeEffect = () => { + public mountEffect = () => { this.lazyLoading.initEffect(); - return this.timeoutManager.clearAll; }; public constructor(parameters: RichTreeViewProStoreParameters) { diff --git a/packages/x-tree-view/src/internals/MinimalTreeViewStore/MinimalTreeViewStore.ts b/packages/x-tree-view/src/internals/MinimalTreeViewStore/MinimalTreeViewStore.ts index c4d81da7072ca..46bfff8a921c1 100644 --- a/packages/x-tree-view/src/internals/MinimalTreeViewStore/MinimalTreeViewStore.ts +++ b/packages/x-tree-view/src/internals/MinimalTreeViewStore/MinimalTreeViewStore.ts @@ -1,6 +1,11 @@ import { Store } from '@mui/x-internals/store'; import { warnOnce } from '@mui/x-internals/warning'; import { EventManager } from '@mui/x-internals/EventManager'; +import { + DisposableStack, + disposeSymbol, + unwrapSuppressedErrors, +} from '@mui/x-internals/disposable'; import { TreeViewModelUpdater, MinimalTreeViewParameters, @@ -40,13 +45,23 @@ export class MinimalTreeViewStore< private mapper: TreeViewParametersToStateMapper; - private eventManager = new EventManager(); + // Owns the store's teardown. Declared first so the resources below register + // against it during field initialization; disposed by `useDisposable` on + // unmount (see `[disposeSymbol]`). `public` so plugins can register their own + // subscriptions against it (hidden from the context store type). + public readonly disposables = new DisposableStack(); + + private eventManager = this.disposables.adopt(new EventManager(), (manager) => + manager.removeAllListeners(), + ); public instanceName: string; public parameters: Parameters; - public timeoutManager = new TimeoutManager(); + public timeoutManager = this.disposables.adopt(new TimeoutManager(), (manager) => + manager.clearAll(), + ); public itemPluginManager = new TreeViewItemPluginManager(); @@ -168,11 +183,32 @@ export class MinimalTreeViewStore< } /** - * Returns a cleanup function that need to be called when the store is destroyed. + * Runs mount-time side effects that must not happen during render (the store + * is created during render by `useDisposable`). No-op by default; overridden + * by stores that kick off work on mount (e.g. lazy-loading fetches). Safe to + * call more than once (StrictMode replays mount effects). */ - public disposeEffect = () => { - return this.timeoutManager.clearAll; - }; + public mountEffect = () => {}; + + /** + * Disposes the store synchronously when the component unmounts. `useDisposable` + * handles React StrictMode's simulated unmount, so this runs once on real unmount. + */ + [disposeSymbol](): void { + if (this.disposables.disposed) { + return; + } + try { + this.disposables.dispose(); + } catch (error) { + if (process.env.NODE_ENV !== 'production') { + console.error( + 'MUI X Tree View: error while disposing the store.', + ...unwrapSuppressedErrors(error), + ); + } + } + } /** * Whether updates based on `props.items` change should be ignored. @@ -190,13 +226,15 @@ export class MinimalTreeViewStore< ) => { let previousValue = selector(this.state); - this.subscribe((state) => { - const nextValue = selector(state); - if (nextValue !== previousValue) { - effect(previousValue, nextValue); - previousValue = nextValue; - } - }); + this.disposables.defer( + this.subscribe((state) => { + const nextValue = selector(state); + if (nextValue !== previousValue) { + effect(previousValue, nextValue); + previousValue = nextValue; + } + }), + ); }; /** diff --git a/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts b/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts index 88c3b6135a93d..87b963f7db4f9 100644 --- a/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts +++ b/packages/x-tree-view/src/internals/TreeViewProvider/TreeViewProvider.types.ts @@ -1,4 +1,5 @@ import * as React from 'react'; +import { disposeSymbol } from '@mui/x-internals/disposable'; import { TreeItemWrapper, TreeViewItemPluginResponse, @@ -19,7 +20,9 @@ export type TreeViewStoreInContext = Omit< | 'update' | 'set' | 'updateStateFromParameters' - | 'disposeEffect' + | 'disposables' + | typeof disposeSymbol + | 'mountEffect' | 'registerStoreEffect' | 'itemPluginManager' | 'parameters' diff --git a/packages/x-tree-view/src/internals/hooks/useTreeViewStore.ts b/packages/x-tree-view/src/internals/hooks/useTreeViewStore.ts index 098e871d96a16..16311407bb87a 100644 --- a/packages/x-tree-view/src/internals/hooks/useTreeViewStore.ts +++ b/packages/x-tree-view/src/internals/hooks/useTreeViewStore.ts @@ -1,7 +1,7 @@ 'use client'; -import { useRefWithInit } from '@base-ui/utils/useRefWithInit'; import { useIsoLayoutEffect } from '@base-ui/utils/useIsoLayoutEffect'; import { useOnMount } from '@base-ui/utils/useOnMount'; +import { useDisposable } from '@mui/x-internals/useDisposable'; import { useRtl } from '@mui/system/RtlProvider'; import { TreeViewAnyStore } from '../models'; @@ -22,14 +22,16 @@ export function useTreeViewStore( parameters: UseTreeViewStoreParameters, ): TStore { const isRtl = useRtl(); - const store = useRefWithInit(() => new StoreClass({ ...parameters, isRtl })).current; + const store = useDisposable(() => new StoreClass({ ...parameters, isRtl })); useIsoLayoutEffect( () => store.updateStateFromParameters({ ...parameters, isRtl }), [store, isRtl, parameters], ); - useOnMount(store.disposeEffect); + // Mount-time side effects (e.g. kicking off lazy-loading fetches). The store is + // created during render by `useDisposable`, so these can't run in the factory. + useOnMount(store.mountEffect); return store; } diff --git a/packages/x-tree-view/src/internals/plugins/focus/TreeViewFocusPlugin.ts b/packages/x-tree-view/src/internals/plugins/focus/TreeViewFocusPlugin.ts index 668ca60abb545..3b677ccc6e6eb 100644 --- a/packages/x-tree-view/src/internals/plugins/focus/TreeViewFocusPlugin.ts +++ b/packages/x-tree-view/src/internals/plugins/focus/TreeViewFocusPlugin.ts @@ -20,35 +20,37 @@ export class TreeViewFocusPlugin { // Whenever the items change, we need to ensure the focused item is still present. // If the focused item was removed, focus the closest neighbor instead of the first item. let previousState = store.state; - this.store.subscribe((newState) => { - // Only run when items actually changed. - if (newState.itemMetaLookup === previousState.itemMetaLookup) { - previousState = newState; - return; - } + this.store.disposables.defer( + this.store.subscribe((newState) => { + // Only run when items actually changed. + if (newState.itemMetaLookup === previousState.itemMetaLookup) { + previousState = newState; + return; + } + + const focusedItemId = focusSelectors.focusedItemId(newState); + if (focusedItemId == null || itemsSelectors.itemMeta(newState, focusedItemId)) { + previousState = newState; + return; + } + + const checkItemInNewTree = (itemId: TreeViewItemId | null) => + itemId == null || !itemsSelectors.itemMeta(newState, itemId) ? null : itemId; + + const itemToFocusId = + checkItemInNewTree(getNextNavigableItem(previousState, focusedItemId)) ?? + checkItemInNewTree(getPreviousNavigableItem(previousState, focusedItemId)) ?? + getFirstNavigableItem(newState); + + if (itemToFocusId == null) { + this.setFocusedItemId(null); + } else { + this.applyItemFocus(null, itemToFocusId); + } - const focusedItemId = focusSelectors.focusedItemId(newState); - if (focusedItemId == null || itemsSelectors.itemMeta(newState, focusedItemId)) { previousState = newState; - return; - } - - const checkItemInNewTree = (itemId: TreeViewItemId | null) => - itemId == null || !itemsSelectors.itemMeta(newState, itemId) ? null : itemId; - - const itemToFocusId = - checkItemInNewTree(getNextNavigableItem(previousState, focusedItemId)) ?? - checkItemInNewTree(getPreviousNavigableItem(previousState, focusedItemId)) ?? - getFirstNavigableItem(newState); - - if (itemToFocusId == null) { - this.setFocusedItemId(null); - } else { - this.applyItemFocus(null, itemToFocusId); - } - - previousState = newState; - }); + }), + ); } private setFocusedItemId = (itemId: TreeViewItemId | null) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a3d51cad3077d..7825ef5f466ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,7 +71,7 @@ catalogs: version: 9.1.1 '@mui/utils': specifier: ^9.0.1 - version: 9.1.1 + version: 9.0.1 '@mui/x-internal-exceljs-fork': specifier: 5.0.0 version: 5.0.0 @@ -116,7 +116,7 @@ catalogs: version: 1.5.0 '@typescript-eslint/parser': specifier: ^8.59.4 - version: 8.61.0 + version: 8.59.4 '@vitejs/plugin-react': specifier: ^6.0.2 version: 6.0.2 @@ -277,11 +277,11 @@ importers: specifier: 1.0.9-canary.81 version: 1.0.9-canary.81(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(rolldown@1.0.3)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) '@mui/internal-code-infra': - specifier: 0.0.4-canary.64 - version: 0.0.4-canary.64(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8) + specifier: 0.0.4-canary.66 + version: 0.0.4-canary.66(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8) '@mui/internal-core-docs': specifier: 'catalog:' - version: 9.0.2-canary.2(b296b1cdd39953f5604212bc0a0595d1) + version: 9.0.2-canary.2(53a1a001fd30195f33cb3e028035aa48) '@mui/internal-markdown': specifier: 3.0.9-canary.2 version: 3.0.9-canary.2 @@ -299,7 +299,7 @@ importers: version: 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@next/eslint-plugin-next': specifier: 16.2.6 version: 16.2.6 @@ -338,7 +338,7 @@ importers: version: 17.0.35 '@typescript-eslint/parser': specifier: 'catalog:' - version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@vitejs/plugin-react': specifier: 'catalog:' version: 6.0.2(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) @@ -500,7 +500,7 @@ importers: version: 9.1.1(@mui/material@9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/internal-core-docs': specifier: 'catalog:' - version: 9.0.2-canary.2(97fec607400060b7286de6a0fd9a68cb) + version: 9.0.2-canary.2(3a18dddb42010c2e12709722f49f139f) '@mui/internal-docs-infra': specifier: ^0.11.1-canary.15 version: 0.11.1-canary.15(@types/react@19.2.15)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.60.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) @@ -521,7 +521,7 @@ importers: version: 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts': specifier: workspace:^ version: link:../packages/x-charts/build @@ -747,7 +747,7 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.59.4 - version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) devDependencies: '@types/eslint': specifier: 9.6.1 @@ -757,7 +757,7 @@ importers: version: 19.2.15 '@typescript-eslint/parser': specifier: 'catalog:' - version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/rule-tester': specifier: 8.59.4 version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) @@ -775,7 +775,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts-vendor': specifier: workspace:^ version: link:../x-charts-vendor/build @@ -843,7 +843,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts': specifier: workspace:^ version: link:../x-charts/build @@ -906,7 +906,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts': specifier: workspace:^ version: link:../x-charts/build @@ -1067,7 +1067,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-chat-headless': specifier: workspace:* version: link:../x-chat-headless/build @@ -1123,7 +1123,7 @@ importers: version: 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1190,7 +1190,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1305,7 +1305,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-data-grid': specifier: workspace:^ version: link:../x-data-grid/build @@ -1373,7 +1373,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-data-grid': specifier: workspace:^ version: link:../x-data-grid/build @@ -1432,7 +1432,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1518,7 +1518,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-date-pickers': specifier: workspace:^ version: link:../x-date-pickers/build @@ -1602,7 +1602,7 @@ importers: version: 0.2.9(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) core-js-pure: specifier: 'catalog:' version: 3.49.0 @@ -1637,7 +1637,7 @@ importers: version: 7.29.7 '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1678,7 +1678,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1852,7 +1852,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1952,7 +1952,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -2008,7 +2008,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -2073,7 +2073,7 @@ importers: version: 7.29.7 '@mui/utils': specifier: 'catalog:' - version: 9.1.1(@types/react@19.2.15)(react@19.2.6) + version: 9.0.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -4276,8 +4276,8 @@ packages: resolution: {integrity: sha512-omgJCN/8RNOpO3FF0/ilW0PaImjDXeqDZStIGSaf6BEH1L7VwcXU7812ivHzMtTwLh8et/pq7q07j0j46B31JA==} hasBin: true - '@mui/internal-code-infra@0.0.4-canary.64': - resolution: {integrity: sha512-z/5cg2UA0BPwCMsF1WXJ1UOzyDvo0LwQPKm/DTf/pZtGcLlSg6vVWFQ8/mKIIMJ87TKH5YfKiNgZuC083idTNg==} + '@mui/internal-code-infra@0.0.4-canary.66': + resolution: {integrity: sha512-dPm/mwzVzCCeBexrVKtpdcDKWAQk5KW/eII7wl0mIqfq6lcZKPizUJuz57A3rmUUvXKh37UCbj38LbnlQtFrQg==} hasBin: true peerDependencies: '@next/eslint-plugin-next': '*' @@ -4488,6 +4488,14 @@ packages: '@types/react': optional: true + '@mui/types@9.0.0': + resolution: {integrity: sha512-i1cuFCAWN44b3AJWO7mh7tuh1sqbQSeVr/94oG0TX5uXivac8XalgE4/6fQZcmGZigzbQ35IXxj/4jLpRIBYZg==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@mui/types@9.1.1': resolution: {integrity: sha512-Zjt7u8wNvDg40rPTGoL+TnfkpuSKjwubsNSFRH1KAVZLcaV4I3AFNHIFbvH7p4F3alEibSbdd90xAgn5Rnfndg==} peerDependencies: @@ -4516,6 +4524,16 @@ packages: '@types/react': optional: true + '@mui/utils@9.0.1': + resolution: {integrity: sha512-f3UO3jNN1pYg5zxqXC81Bvv8hx5ACcYc0387382ZI7M5ono1heIwHYLrKsz85myguWdeVKPRZGmDdynWUBjK2g==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@mui/utils@9.1.1': resolution: {integrity: sha512-qSNfnkzZMptaaWFFklpDf4NPJztgwsMDVfM/sSDt+wq4ssYSBhLYwwjuB6eS/+p2IUYbeRzHluzXbw0Zn7aI4A==} engines: {node: '>=14.0.0'} @@ -9817,6 +9835,9 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-is@19.2.4: + resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} + react-is@19.2.7: resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} @@ -12642,7 +12663,7 @@ snapshots: '@es-joy/jsdoccomment@0.87.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/types': 8.59.4 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.2.0 @@ -13339,7 +13360,7 @@ snapshots: - tsx - yaml - '@mui/internal-code-infra@0.0.4-canary.64(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8)': + '@mui/internal-code-infra@0.0.4-canary.66(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8)': dependencies: '@argos-ci/core': 6.0.1 '@babel/cli': 7.29.7(@babel/core@7.29.7) @@ -13365,9 +13386,9 @@ snapshots: '@octokit/oauth-methods': 6.0.2 '@octokit/rest': 22.0.1 '@pnpm/find-workspace-dir': 1000.1.5 - '@typescript-eslint/types': 8.61.0 - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8) + '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@vitest/eslint-plugin': 1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8) babel-plugin-optimize-clsx: 2.6.2 babel-plugin-react-compiler: 1.0.0 babel-plugin-transform-import-meta: 2.3.3(@babel/core@7.29.7) @@ -13382,9 +13403,9 @@ snapshots: eslint: 10.4.1(jiti@2.7.0) eslint-config-prettier: 10.1.8(eslint@10.4.1(jiti@2.7.0)) eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@10.4.1(jiti@2.7.0)) - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-compat: 7.0.2(eslint@10.4.1(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-mdx: 3.7.0(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-mocha: 11.2.0(eslint@10.4.1(jiti@2.7.0)) @@ -13450,7 +13471,7 @@ snapshots: - supports-color - vitest - '@mui/internal-core-docs@9.0.2-canary.2(97fec607400060b7286de6a0fd9a68cb)': + '@mui/internal-core-docs@9.0.2-canary.2(3a18dddb42010c2e12709722f49f139f)': dependencies: '@babel/runtime': 7.29.7 '@base-ui/react': 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -13464,7 +13485,7 @@ snapshots: '@mui/material-nextjs': 9.1.1(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/server@11.11.0)(@types/react@19.2.15)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.60.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@mui/stylis-plugin-rtl': 9.1.1(stylis@4.4.0) '@mui/system': 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) - '@mui/utils': 9.1.1(@types/react@19.2.15)(react@19.2.6) + '@mui/utils': 9.0.1(@types/react@19.2.15)(react@19.2.6) '@types/react': 19.2.15 '@types/stylis': 4.2.7 chai: 6.2.2 @@ -13484,7 +13505,7 @@ snapshots: optionalDependencies: styled-components: 6.4.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@mui/internal-core-docs@9.0.2-canary.2(b296b1cdd39953f5604212bc0a0595d1)': + '@mui/internal-core-docs@9.0.2-canary.2(53a1a001fd30195f33cb3e028035aa48)': dependencies: '@babel/runtime': 7.29.7 '@base-ui/react': 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -13498,7 +13519,7 @@ snapshots: '@mui/material-nextjs': 9.1.1(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/server@11.11.0)(@types/react@19.2.15)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.60.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@mui/stylis-plugin-rtl': 9.1.1(stylis@4.4.0) '@mui/system': 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) - '@mui/utils': 9.1.1(@types/react@19.2.15)(react@19.2.6) + '@mui/utils': 9.0.1(@types/react@19.2.15)(react@19.2.6) '@types/react': 19.2.15 '@types/stylis': 4.2.7 chai: 6.2.2 @@ -13721,6 +13742,12 @@ snapshots: optionalDependencies: '@types/react': 19.2.15 + '@mui/types@9.0.0(@types/react@19.2.15)': + dependencies: + '@babel/runtime': 7.29.7 + optionalDependencies: + '@types/react': 19.2.15 + '@mui/types@9.1.1(@types/react@19.2.15)': dependencies: '@babel/runtime': 7.29.7 @@ -13735,7 +13762,7 @@ snapshots: clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.6 - react-is: 19.2.7 + react-is: 19.2.4 optionalDependencies: '@types/react': 19.2.15 @@ -13747,7 +13774,19 @@ snapshots: clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.6 - react-is: 19.2.7 + react-is: 19.2.4 + optionalDependencies: + '@types/react': 19.2.15 + + '@mui/utils@9.0.1(@types/react@19.2.15)(react@19.2.6)': + dependencies: + '@babel/runtime': 7.29.7 + '@mui/types': 9.0.0(@types/react@19.2.15) + '@types/prop-types': 15.7.15 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 19.2.6 + react-is: 19.2.4 optionalDependencies: '@types/react': 19.2.15 @@ -14855,6 +14894,23 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/type-utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.61.0 + eslint: 10.4.1(jiti@2.7.0) + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + optional: true + '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -14897,8 +14953,8 @@ snapshots: '@typescript-eslint/project-service@8.59.4(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) - '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) + '@typescript-eslint/types': 8.59.4 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: @@ -15137,13 +15193,13 @@ snapshots: optionalDependencies: '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.8) - '@vitest/eslint-plugin@1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8)': + '@vitest/eslint-plugin@1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8)': dependencies: - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.1(jiti@2.7.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 vitest: 4.1.8(@types/node@22.19.19)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) transitivePeerDependencies: @@ -16578,7 +16634,7 @@ snapshots: tinyglobby: 0.2.17 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) transitivePeerDependencies: - supports-color @@ -16601,11 +16657,11 @@ snapshots: - bluebird - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.1(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@10.4.1(jiti@2.7.0)) @@ -16628,7 +16684,7 @@ snapshots: lodash: 4.18.1 pkg-dir: 5.0.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -16639,7 +16695,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.4.1(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -16651,7 +16707,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -16767,8 +16823,8 @@ snapshots: eslint-plugin-testing-library@7.16.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.4 + '@typescript-eslint/utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.1(jiti@2.7.0) transitivePeerDependencies: - supports-color @@ -19854,6 +19910,8 @@ snapshots: react-is@18.3.1: {} + react-is@19.2.4: {} + react-is@19.2.7: {} react-router@7.16.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): From de5c2a41566fb5c26893a3dd5806a248333bff9f Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Wed, 17 Jun 2026 17:13:50 -0400 Subject: [PATCH 2/3] build: dedupe lockfile after code-infra bump `pnpm dedupe` converges @mui/utils and @typescript-eslint/parser to single versions, unblocked by the @mui/internal-code-infra canary.66 bump. Fixes the `test_static` "`pnpm dedupe` was run?" check. Co-Authored-By: Claude Opus 4.8 --- pnpm-lock.yaml | 166 ++++++++++++++++--------------------------------- 1 file changed, 54 insertions(+), 112 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7825ef5f466ee..c60216aa60dc1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,7 +71,7 @@ catalogs: version: 9.1.1 '@mui/utils': specifier: ^9.0.1 - version: 9.0.1 + version: 9.1.1 '@mui/x-internal-exceljs-fork': specifier: 5.0.0 version: 5.0.0 @@ -116,7 +116,7 @@ catalogs: version: 1.5.0 '@typescript-eslint/parser': specifier: ^8.59.4 - version: 8.59.4 + version: 8.61.0 '@vitejs/plugin-react': specifier: ^6.0.2 version: 6.0.2 @@ -278,10 +278,10 @@ importers: version: 1.0.9-canary.81(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(rolldown@1.0.3)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0) '@mui/internal-code-infra': specifier: 0.0.4-canary.66 - version: 0.0.4-canary.66(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8) + version: 0.0.4-canary.66(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8) '@mui/internal-core-docs': specifier: 'catalog:' - version: 9.0.2-canary.2(53a1a001fd30195f33cb3e028035aa48) + version: 9.0.2-canary.2(b296b1cdd39953f5604212bc0a0595d1) '@mui/internal-markdown': specifier: 3.0.9-canary.2 version: 3.0.9-canary.2 @@ -299,7 +299,7 @@ importers: version: 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@next/eslint-plugin-next': specifier: 16.2.6 version: 16.2.6 @@ -338,7 +338,7 @@ importers: version: 17.0.35 '@typescript-eslint/parser': specifier: 'catalog:' - version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@vitejs/plugin-react': specifier: 'catalog:' version: 6.0.2(babel-plugin-react-compiler@1.0.0)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) @@ -500,7 +500,7 @@ importers: version: 9.1.1(@mui/material@9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/internal-core-docs': specifier: 'catalog:' - version: 9.0.2-canary.2(3a18dddb42010c2e12709722f49f139f) + version: 9.0.2-canary.2(97fec607400060b7286de6a0fd9a68cb) '@mui/internal-docs-infra': specifier: ^0.11.1-canary.15 version: 0.11.1-canary.15(@types/react@19.2.15)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.60.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(prettier@3.8.3)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(typescript@6.0.3) @@ -521,7 +521,7 @@ importers: version: 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts': specifier: workspace:^ version: link:../packages/x-charts/build @@ -747,7 +747,7 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^8.59.4 - version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) devDependencies: '@types/eslint': specifier: 9.6.1 @@ -757,7 +757,7 @@ importers: version: 19.2.15 '@typescript-eslint/parser': specifier: 'catalog:' - version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + version: 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) '@typescript-eslint/rule-tester': specifier: 8.59.4 version: 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) @@ -775,7 +775,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts-vendor': specifier: workspace:^ version: link:../x-charts-vendor/build @@ -843,7 +843,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts': specifier: workspace:^ version: link:../x-charts/build @@ -906,7 +906,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-charts': specifier: workspace:^ version: link:../x-charts/build @@ -1067,7 +1067,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-chat-headless': specifier: workspace:* version: link:../x-chat-headless/build @@ -1123,7 +1123,7 @@ importers: version: 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:* version: link:../x-internals/build @@ -1190,7 +1190,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1305,7 +1305,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-data-grid': specifier: workspace:^ version: link:../x-data-grid/build @@ -1373,7 +1373,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-data-grid': specifier: workspace:^ version: link:../x-data-grid/build @@ -1432,7 +1432,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1518,7 +1518,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-date-pickers': specifier: workspace:^ version: link:../x-date-pickers/build @@ -1602,7 +1602,7 @@ importers: version: 0.2.9(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) core-js-pure: specifier: 'catalog:' version: 3.49.0 @@ -1637,7 +1637,7 @@ importers: version: 7.29.7 '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1678,7 +1678,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1852,7 +1852,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -1952,7 +1952,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -2008,7 +2008,7 @@ importers: version: 11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -2073,7 +2073,7 @@ importers: version: 7.29.7 '@mui/utils': specifier: 'catalog:' - version: 9.0.1(@types/react@19.2.15)(react@19.2.6) + version: 9.1.1(@types/react@19.2.15)(react@19.2.6) '@mui/x-internals': specifier: workspace:^ version: link:../x-internals/build @@ -4488,14 +4488,6 @@ packages: '@types/react': optional: true - '@mui/types@9.0.0': - resolution: {integrity: sha512-i1cuFCAWN44b3AJWO7mh7tuh1sqbQSeVr/94oG0TX5uXivac8XalgE4/6fQZcmGZigzbQ35IXxj/4jLpRIBYZg==} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@mui/types@9.1.1': resolution: {integrity: sha512-Zjt7u8wNvDg40rPTGoL+TnfkpuSKjwubsNSFRH1KAVZLcaV4I3AFNHIFbvH7p4F3alEibSbdd90xAgn5Rnfndg==} peerDependencies: @@ -4524,16 +4516,6 @@ packages: '@types/react': optional: true - '@mui/utils@9.0.1': - resolution: {integrity: sha512-f3UO3jNN1pYg5zxqXC81Bvv8hx5ACcYc0387382ZI7M5ono1heIwHYLrKsz85myguWdeVKPRZGmDdynWUBjK2g==} - engines: {node: '>=14.0.0'} - peerDependencies: - '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - '@mui/utils@9.1.1': resolution: {integrity: sha512-qSNfnkzZMptaaWFFklpDf4NPJztgwsMDVfM/sSDt+wq4ssYSBhLYwwjuB6eS/+p2IUYbeRzHluzXbw0Zn7aI4A==} engines: {node: '>=14.0.0'} @@ -9835,9 +9817,6 @@ packages: react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - react-is@19.2.4: - resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} - react-is@19.2.7: resolution: {integrity: sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==} @@ -12663,7 +12642,7 @@ snapshots: '@es-joy/jsdoccomment@0.87.0': dependencies: '@types/estree': 1.0.9 - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/types': 8.61.0 comment-parser: 1.4.7 esquery: 1.7.0 jsdoc-type-pratt-parser: 7.2.0 @@ -13360,7 +13339,7 @@ snapshots: - tsx - yaml - '@mui/internal-code-infra@0.0.4-canary.66(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8)': + '@mui/internal-code-infra@0.0.4-canary.66(@next/eslint-plugin-next@16.2.6)(@types/node@22.19.19)(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(jest-diff@30.2.0)(postcss@8.5.15)(prettier@3.8.3)(stylelint@17.12.0(typescript@6.0.3))(typescript@6.0.3)(vitest@4.1.8)': dependencies: '@argos-ci/core': 6.0.1 '@babel/cli': 7.29.7(@babel/core@7.29.7) @@ -13386,9 +13365,9 @@ snapshots: '@octokit/oauth-methods': 6.0.2 '@octokit/rest': 22.0.1 '@pnpm/find-workspace-dir': 1000.1.5 - '@typescript-eslint/types': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@vitest/eslint-plugin': 1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8) + '@typescript-eslint/types': 8.61.0 + '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@vitest/eslint-plugin': 1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8) babel-plugin-optimize-clsx: 2.6.2 babel-plugin-react-compiler: 1.0.0 babel-plugin-transform-import-meta: 2.3.3(@babel/core@7.29.7) @@ -13403,9 +13382,9 @@ snapshots: eslint: 10.4.1(jiti@2.7.0) eslint-config-prettier: 10.1.8(eslint@10.4.1(jiti@2.7.0)) eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@10.4.1(jiti@2.7.0)) - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-compat: 7.0.2(eslint@10.4.1(jiti@2.7.0)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-jsx-a11y: 6.10.2(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-mdx: 3.7.0(eslint@10.4.1(jiti@2.7.0)) eslint-plugin-mocha: 11.2.0(eslint@10.4.1(jiti@2.7.0)) @@ -13471,7 +13450,7 @@ snapshots: - supports-color - vitest - '@mui/internal-core-docs@9.0.2-canary.2(3a18dddb42010c2e12709722f49f139f)': + '@mui/internal-core-docs@9.0.2-canary.2(97fec607400060b7286de6a0fd9a68cb)': dependencies: '@babel/runtime': 7.29.7 '@base-ui/react': 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -13485,7 +13464,7 @@ snapshots: '@mui/material-nextjs': 9.1.1(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/server@11.11.0)(@types/react@19.2.15)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.60.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@mui/stylis-plugin-rtl': 9.1.1(stylis@4.4.0) '@mui/system': 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) - '@mui/utils': 9.0.1(@types/react@19.2.15)(react@19.2.6) + '@mui/utils': 9.1.1(@types/react@19.2.15)(react@19.2.6) '@types/react': 19.2.15 '@types/stylis': 4.2.7 chai: 6.2.2 @@ -13505,7 +13484,7 @@ snapshots: optionalDependencies: styled-components: 6.4.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6) - '@mui/internal-core-docs@9.0.2-canary.2(53a1a001fd30195f33cb3e028035aa48)': + '@mui/internal-core-docs@9.0.2-canary.2(b296b1cdd39953f5604212bc0a0595d1)': dependencies: '@babel/runtime': 7.29.7 '@base-ui/react': 1.5.0(@date-fns/tz@1.5.0)(@types/react@19.2.15)(date-fns@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) @@ -13519,7 +13498,7 @@ snapshots: '@mui/material-nextjs': 9.1.1(@emotion/cache@11.14.0)(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/server@11.11.0)(@types/react@19.2.15)(next@16.2.6(@babel/core@7.29.7)(@playwright/test@1.60.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6))(react@19.2.6) '@mui/stylis-plugin-rtl': 9.1.1(stylis@4.4.0) '@mui/system': 9.1.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6))(@types/react@19.2.15)(react@19.2.6) - '@mui/utils': 9.0.1(@types/react@19.2.15)(react@19.2.6) + '@mui/utils': 9.1.1(@types/react@19.2.15)(react@19.2.6) '@types/react': 19.2.15 '@types/stylis': 4.2.7 chai: 6.2.2 @@ -13742,12 +13721,6 @@ snapshots: optionalDependencies: '@types/react': 19.2.15 - '@mui/types@9.0.0(@types/react@19.2.15)': - dependencies: - '@babel/runtime': 7.29.7 - optionalDependencies: - '@types/react': 19.2.15 - '@mui/types@9.1.1(@types/react@19.2.15)': dependencies: '@babel/runtime': 7.29.7 @@ -13762,7 +13735,7 @@ snapshots: clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.6 - react-is: 19.2.4 + react-is: 19.2.7 optionalDependencies: '@types/react': 19.2.15 @@ -13774,19 +13747,7 @@ snapshots: clsx: 2.1.1 prop-types: 15.8.1 react: 19.2.6 - react-is: 19.2.4 - optionalDependencies: - '@types/react': 19.2.15 - - '@mui/utils@9.0.1(@types/react@19.2.15)(react@19.2.6)': - dependencies: - '@babel/runtime': 7.29.7 - '@mui/types': 9.0.0(@types/react@19.2.15) - '@types/prop-types': 15.7.15 - clsx: 2.1.1 - prop-types: 15.8.1 - react: 19.2.6 - react-is: 19.2.4 + react-is: 19.2.7 optionalDependencies: '@types/react': 19.2.15 @@ -14894,23 +14855,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.61.0 - '@typescript-eslint/type-utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.61.0 - eslint: 10.4.1(jiti@2.7.0) - ignore: 7.0.5 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - optional: true - '@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -14953,8 +14897,8 @@ snapshots: '@typescript-eslint/project-service@8.59.4(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.59.4(typescript@6.0.3) - '@typescript-eslint/types': 8.59.4 + '@typescript-eslint/tsconfig-utils': 8.61.0(typescript@6.0.3) + '@typescript-eslint/types': 8.61.0 debug: 4.4.3 typescript: 6.0.3 transitivePeerDependencies: @@ -15193,13 +15137,13 @@ snapshots: optionalDependencies: '@vitest/browser': 4.1.8(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0))(vitest@4.1.8) - '@vitest/eslint-plugin@1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8)': + '@vitest/eslint-plugin@1.6.20(@typescript-eslint/eslint-plugin@8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3)(vitest@4.1.8)': dependencies: - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.1(jiti@2.7.0) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/eslint-plugin': 8.61.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) typescript: 6.0.3 vitest: 4.1.8(@types/node@22.19.19)(@vitest/browser-playwright@4.1.8)(@vitest/coverage-v8@4.1.8)(jsdom@29.1.1)(vite@8.0.16(@types/node@22.19.19)(esbuild@0.28.0)(jiti@2.7.0)(terser@5.48.0)(tsx@4.22.3)(yaml@2.9.0)) transitivePeerDependencies: @@ -16634,7 +16578,7 @@ snapshots: tinyglobby: 0.2.17 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) transitivePeerDependencies: - supports-color @@ -16657,11 +16601,11 @@ snapshots: - bluebird - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.1(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 4.4.4(eslint-plugin-import@2.32.0)(eslint@10.4.1(jiti@2.7.0)) @@ -16684,7 +16628,7 @@ snapshots: lodash: 4.18.1 pkg-dir: 5.0.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -16695,7 +16639,7 @@ snapshots: doctrine: 2.1.0 eslint: 10.4.1(jiti@2.7.0) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@4.4.4)(eslint@10.4.1(jiti@2.7.0)) hasown: 2.0.4 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -16707,7 +16651,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -16823,8 +16767,8 @@ snapshots: eslint-plugin-testing-library@7.16.2(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3): dependencies: - '@typescript-eslint/scope-manager': 8.59.4 - '@typescript-eslint/utils': 8.59.4(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.61.0 + '@typescript-eslint/utils': 8.61.0(eslint@10.4.1(jiti@2.7.0))(typescript@6.0.3) eslint: 10.4.1(jiti@2.7.0) transitivePeerDependencies: - supports-color @@ -19910,8 +19854,6 @@ snapshots: react-is@18.3.1: {} - react-is@19.2.4: {} - react-is@19.2.7: {} react-router@7.16.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6): From 1d7dba4286bb81003e2429d57ed5ab773cd23259 Mon Sep 17 00:00:00 2001 From: Rom Grk Date: Wed, 17 Jun 2026 17:30:30 -0400 Subject: [PATCH 3/3] fix: resolve the two Data Grid no-floating-cleanup cases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - useGridRowSelection: delete the dead effect. `runIf` is curried, so the statement has been a no-op since #20668; removing it is behavior-identical and drops the confusing dead code. (removeOutdatedSelection is still wired to the `filteredRowsSet` event.) - useGridRegisterStrategyProcessor: keep the discard, reword to a NOTE. The unregister fn is intentionally dropped — a strategy processor must outlive the registering component (applyStrategyProcessor throws if the active strategy's processor is missing) and the cache is reclaimed with the grid api, so it is not a leak. Co-Authored-By: Claude Opus 4.8 --- .../useGridRegisterStrategyProcessor.ts | 10 ++++++---- .../hooks/features/rowSelection/useGridRowSelection.ts | 8 -------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts b/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts index 59fb6ac96ca23..494bede0b871b 100644 --- a/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts +++ b/packages/x-data-grid/src/hooks/core/strategyProcessing/useGridRegisterStrategyProcessor.ts @@ -15,10 +15,12 @@ export const useGridRegisterStrategyProcessor = < processor: GridStrategyProcessor, ) => { const registerPreProcessor = React.useCallback(() => { - // FIXME: the unregister fn is discarded — unlike `useGridRegisterPipeProcessor`, - // which stores and calls it. Strategy processors currently must outlive the - // component: tearing one down on unmount breaks strategy resolution (e.g. - // "No processor found" on tree-data filtering/sorting). `void` until resolved. + // NOTE: the unregister fn is intentionally discarded. Unlike pipe processors + // (which are additive), a strategy processor is required for as long as its + // strategy is active — `applyStrategyProcessor` throws if the active strategy's + // processor is missing — so it must outlive the registering component. The cache + // keeps a single entry per (processor, strategy) and is reclaimed with the grid + // api, so nothing leaks; `void` documents the deliberate discard. void apiRef.current.registerStrategyProcessor(strategyName, group, processor); }, [apiRef, processor, group, strategyName]); diff --git a/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts b/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts index 6f7dbe0bdca6f..bb6d87b140c33 100644 --- a/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts +++ b/packages/x-data-grid/src/hooks/features/rowSelection/useGridRowSelection.ts @@ -960,14 +960,6 @@ You need to upgrade to DataGridPro or DataGridPremium component to unlock multip } }, [apiRef, canHaveMultipleSelection, checkboxSelection, isStateControlled, props.rowSelection]); - React.useEffect(() => { - // FIXME: no-op since #20668. `runIf` is curried, so this builds a wrapper and - // discards it (previously `runIfRowSelectionIsEnabled(removeOutdatedSelection)`, - // which invoked it). Restoring the call changes selection behavior, so it needs - // a decision; `void` preserves current behavior. See #20668. - void runIf(props.rowSelection, removeOutdatedSelection); - }, [props.rowSelection, removeOutdatedSelection]); - React.useEffect(() => { if (isFirstRender.current) { isFirstRender.current = false;