From 4765a5217b98db87d644a33c2be716108e17bcfe Mon Sep 17 00:00:00 2001 From: Flavien DELANGLE Date: Fri, 12 Jul 2024 13:29:28 +0200 Subject: [PATCH] [internals] Move `EventManager` to `@mui/x-internals` package (#13815) --- .../hooks/core/useGridApiInitialization.ts | 2 +- .../src/hooks/utils/useGridApiEventHandler.ts | 2 +- .../x-data-grid/src/models/api/gridCoreApi.ts | 2 +- .../src/EventManager}/EventManager.test.ts | 0 .../src/EventManager}/EventManager.ts | 0 .../x-internals/src/EventManager/index.ts | 2 + packages/x-tree-view-pro/package.json | 1 + packages/x-tree-view-pro/tsconfig.build.json | 1 + packages/x-tree-view/package.json | 1 + .../useTreeViewInstanceEvents.ts | 2 +- .../src/internals/utils/EventManager.ts | 103 ------------------ packages/x-tree-view/tsconfig.build.json | 1 + pnpm-lock.yaml | 6 + 13 files changed, 16 insertions(+), 107 deletions(-) rename packages/{x-data-grid/src/utils => x-internals/src/EventManager}/EventManager.test.ts (100%) rename packages/{x-data-grid/src/utils => x-internals/src/EventManager}/EventManager.ts (100%) create mode 100644 packages/x-internals/src/EventManager/index.ts delete mode 100644 packages/x-tree-view/src/internals/utils/EventManager.ts diff --git a/packages/x-data-grid/src/hooks/core/useGridApiInitialization.ts b/packages/x-data-grid/src/hooks/core/useGridApiInitialization.ts index e73bf0584789..61f639fb183a 100644 --- a/packages/x-data-grid/src/hooks/core/useGridApiInitialization.ts +++ b/packages/x-data-grid/src/hooks/core/useGridApiInitialization.ts @@ -1,11 +1,11 @@ import * as React from 'react'; +import { EventManager } from '@mui/x-internals/EventManager'; import { Store } from '../../utils/Store'; import { useGridApiMethod } from '../utils/useGridApiMethod'; import { GridSignature } from '../utils/useGridApiEventHandler'; import { DataGridProcessedProps } from '../../models/props/DataGridProps'; import type { GridCoreApi } from '../../models'; import type { GridApiCommon, GridPrivateApiCommon } from '../../models/api/gridApiCommon'; -import { EventManager } from '../../utils/EventManager'; const SYMBOL_API_PRIVATE = Symbol('mui.api_private'); diff --git a/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.ts b/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.ts index 14fa7e1df32b..2e75893309e9 100644 --- a/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.ts +++ b/packages/x-data-grid/src/hooks/utils/useGridApiEventHandler.ts @@ -1,7 +1,7 @@ import * as React from 'react'; +import { EventListenerOptions } from '@mui/x-internals/EventManager'; import { GridEventListener, GridEvents } from '../../models/events'; import { UnregisterToken, CleanupTracking } from '../../utils/cleanupTracking/CleanupTracking'; -import { EventListenerOptions } from '../../utils/EventManager'; import { TimerBasedCleanupTracking } from '../../utils/cleanupTracking/TimerBasedCleanupTracking'; import { FinalizationRegistryBasedCleanupTracking } from '../../utils/cleanupTracking/FinalizationRegistryBasedCleanupTracking'; import type { GridApiCommon } from '../../models'; diff --git a/packages/x-data-grid/src/models/api/gridCoreApi.ts b/packages/x-data-grid/src/models/api/gridCoreApi.ts index 702f1a9d511e..ac99d8652da1 100644 --- a/packages/x-data-grid/src/models/api/gridCoreApi.ts +++ b/packages/x-data-grid/src/models/api/gridCoreApi.ts @@ -1,7 +1,7 @@ import * as React from 'react'; +import { EventManager, EventListenerOptions } from '@mui/x-internals/EventManager'; import { GridEventPublisher, GridEventListener, GridEvents } from '../events'; import { Store } from '../../utils/Store'; -import { EventManager, EventListenerOptions } from '../../utils/EventManager'; import { GridApiCaches } from '../gridApiCaches'; import type { GridApiCommon, GridPrivateApiCommon } from './gridApiCommon'; import type { DataGridProcessedProps } from '../props/DataGridProps'; diff --git a/packages/x-data-grid/src/utils/EventManager.test.ts b/packages/x-internals/src/EventManager/EventManager.test.ts similarity index 100% rename from packages/x-data-grid/src/utils/EventManager.test.ts rename to packages/x-internals/src/EventManager/EventManager.test.ts diff --git a/packages/x-data-grid/src/utils/EventManager.ts b/packages/x-internals/src/EventManager/EventManager.ts similarity index 100% rename from packages/x-data-grid/src/utils/EventManager.ts rename to packages/x-internals/src/EventManager/EventManager.ts diff --git a/packages/x-internals/src/EventManager/index.ts b/packages/x-internals/src/EventManager/index.ts new file mode 100644 index 000000000000..94faed6f5743 --- /dev/null +++ b/packages/x-internals/src/EventManager/index.ts @@ -0,0 +1,2 @@ +export { EventManager } from './EventManager'; +export type { EventListenerOptions } from './EventManager'; diff --git a/packages/x-tree-view-pro/package.json b/packages/x-tree-view-pro/package.json index f3f15b83c205..1d519a17f183 100644 --- a/packages/x-tree-view-pro/package.json +++ b/packages/x-tree-view-pro/package.json @@ -47,6 +47,7 @@ "@mui/base": "^5.0.0-beta.40", "@mui/system": "^5.16.0", "@mui/utils": "^5.16.0", + "@mui/x-internals": "workspace:*", "@mui/x-license": "workspace:*", "@mui/x-tree-view": "workspace:*", "@types/react-transition-group": "^4.4.10", diff --git a/packages/x-tree-view-pro/tsconfig.build.json b/packages/x-tree-view-pro/tsconfig.build.json index d6b3cce60d04..05c11f55b301 100644 --- a/packages/x-tree-view-pro/tsconfig.build.json +++ b/packages/x-tree-view-pro/tsconfig.build.json @@ -12,6 +12,7 @@ "types": ["node", "@mui/material/themeCssVarsAugmentation"] }, "references": [ + { "path": "../x-internals/tsconfig.build.json" }, { "path": "../x-tree-view/tsconfig.build.json" }, { "path": "../x-license/tsconfig.build.json" } ], diff --git a/packages/x-tree-view/package.json b/packages/x-tree-view/package.json index d78a86817094..52e93f849a01 100644 --- a/packages/x-tree-view/package.json +++ b/packages/x-tree-view/package.json @@ -47,6 +47,7 @@ "@mui/base": "^5.0.0-beta.40", "@mui/system": "^5.16.0", "@mui/utils": "^5.16.0", + "@mui/x-internals": "workspace:*", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.1", "prop-types": "^15.8.1", diff --git a/packages/x-tree-view/src/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.ts b/packages/x-tree-view/src/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.ts index 0357b4096b3d..0363b4b319a7 100644 --- a/packages/x-tree-view/src/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.ts +++ b/packages/x-tree-view/src/internals/corePlugins/useTreeViewInstanceEvents/useTreeViewInstanceEvents.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { EventManager } from '../../utils/EventManager'; +import { EventManager } from '@mui/x-internals/EventManager'; import type { TreeViewPlugin } from '../../models'; import { UseTreeViewInstanceEventsSignature } from './useTreeViewInstanceEvents.types'; import type { TreeViewEventListener } from '../../models/events'; diff --git a/packages/x-tree-view/src/internals/utils/EventManager.ts b/packages/x-tree-view/src/internals/utils/EventManager.ts deleted file mode 100644 index d5f82828743f..000000000000 --- a/packages/x-tree-view/src/internals/utils/EventManager.ts +++ /dev/null @@ -1,103 +0,0 @@ -export type EventListener = (...args: any[]) => void; - -export interface EventListenerOptions { - isFirst?: boolean; -} - -interface EventListenerCollection { - /** - * List of listeners to run before the others - * They are run in the opposite order of the registration order - */ - highPriority: Map; - /** - * List of events to run after the high priority listeners - * They are run in the registration order - */ - regular: Map; -} - -// Used https://gist.github.com/mudge/5830382 as a starting point. -// See https://github.com/browserify/events/blob/master/events.js for -// the Node.js (https://nodejs.org/api/events.html) polyfill used by webpack. -export class EventManager { - maxListeners = 20; - - warnOnce = false; - - events: { [eventName: string]: EventListenerCollection } = {}; - - on(eventName: string, listener: EventListener, options: EventListenerOptions = {}): void { - let collection = this.events[eventName]; - - if (!collection) { - collection = { - highPriority: new Map(), - regular: new Map(), - }; - this.events[eventName] = collection; - } - - if (options.isFirst) { - collection.highPriority.set(listener, true); - } else { - collection.regular.set(listener, true); - } - - if (process.env.NODE_ENV !== 'production') { - const collectionSize = collection.highPriority.size + collection.regular.size; - if (collectionSize > this.maxListeners && !this.warnOnce) { - this.warnOnce = true; - console.warn( - [ - `Possible EventEmitter memory leak detected. ${collectionSize} ${eventName} listeners added.`, - ].join('\n'), - ); - } - } - } - - removeListener(eventName: string, listener: EventListener): void { - if (this.events[eventName]) { - this.events[eventName].regular.delete(listener); - this.events[eventName].highPriority.delete(listener); - } - } - - removeAllListeners(): void { - this.events = {}; - } - - emit(eventName: string, ...args: any[]): void { - const collection = this.events[eventName]; - if (!collection) { - return; - } - - const highPriorityListeners = Array.from(collection.highPriority.keys()); - const regularListeners = Array.from(collection.regular.keys()); - - for (let i = highPriorityListeners.length - 1; i >= 0; i -= 1) { - const listener = highPriorityListeners[i]; - if (collection.highPriority.has(listener)) { - listener.apply(this, args); - } - } - - for (let i = 0; i < regularListeners.length; i += 1) { - const listener = regularListeners[i]; - if (collection.regular.has(listener)) { - listener.apply(this, args); - } - } - } - - once(eventName: string, listener: EventListener): void { - // eslint-disable-next-line consistent-this - const that = this; - this.on(eventName, function oneTimeListener(...args) { - that.removeListener(eventName, oneTimeListener); - listener.apply(that, args); - }); - } -} diff --git a/packages/x-tree-view/tsconfig.build.json b/packages/x-tree-view/tsconfig.build.json index 181fb19517ad..22b901a89403 100644 --- a/packages/x-tree-view/tsconfig.build.json +++ b/packages/x-tree-view/tsconfig.build.json @@ -11,6 +11,7 @@ "rootDir": "./src", "types": ["node", "@mui/material/themeCssVarsAugmentation", "@emotion/styled"] }, + "references": [{ "path": "../x-internals/tsconfig.build.json" }], "include": ["src/**/*.ts*"], "exclude": ["src/**/*.spec.ts*", "src/**/*.test.ts*", "src/tests/**/*"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0008118eeee2..590e747efa10 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1345,6 +1345,9 @@ importers: '@mui/utils': specifier: ^5.16.0 version: 5.16.0(@types/react@18.3.3)(react@18.3.1) + '@mui/x-internals': + specifier: workspace:* + version: link:../x-internals/build '@types/react-transition-group': specifier: ^4.4.10 version: 4.4.10 @@ -1398,6 +1401,9 @@ importers: '@mui/utils': specifier: ^5.16.0 version: 5.16.0(@types/react@18.3.3)(react@18.3.1) + '@mui/x-internals': + specifier: workspace:* + version: link:../x-internals/build '@mui/x-license': specifier: workspace:* version: link:../x-license/build