This is an automated email from the ASF dual-hosted git repository.

hainenber pushed a commit to branch 
feat/replace-lodash-with-tree-shakeable-alternative
in repository https://gitbox.apache.org/repos/asf/superset.git

commit a03813a22f862f107def2939176fd2505d123ebb
Author: hainenber <[email protected]>
AuthorDate: Fri Jan 30 20:46:27 2026 +0700

    feat(fe): migrate to readily tree-shakeable `es-toolkit`
    
    Signed-off-by: hainenber <[email protected]>
---
 superset-frontend/package-lock.json                | 13 +++++++-
 superset-frontend/package.json                     |  1 +
 .../packages/superset-core/src/ui/theme/Theme.tsx  |  4 +--
 .../src/components/CertifiedIconWithTooltip.tsx    |  2 +-
 .../src/operators/sortOperator.ts                  |  2 +-
 .../src/shared-controls/sharedControls.tsx         |  2 +-
 .../test/operators/histogramOperator.test.ts       |  2 +-
 .../packages/superset-ui-core/package.json         |  2 +-
 .../src/color/CategoricalColorNamespace.ts         |  2 +-
 .../src/components/DropdownButton/index.tsx        |  2 +-
 .../DropdownContainer.stories.tsx                  |  2 +-
 .../src/components/InfoTooltip/index.tsx           |  4 +--
 .../src/components/MetadataBar/MetadataBar.tsx     |  2 +-
 .../src/components/Modal/Modal.tsx                 |  2 +-
 .../src/components/SafeMarkdown/SafeMarkdown.tsx   |  2 +-
 .../src/components/Select/AsyncSelect.tsx          |  2 +-
 .../src/components/Select/Select.stories.tsx       |  3 +-
 .../src/components/Select/Select.tsx               |  2 +-
 .../src/components/TableView/TableView.tsx         |  2 +-
 .../src/connection/callApi/parseResponse.ts        |  2 +-
 .../superset-ui-core/src/query/normalizeOrderBy.ts |  2 +-
 .../src/query/normalizeTimeColumn.ts               |  2 +-
 .../src/time-comparison/fetchTimeRange.ts          |  5 ++--
 .../src/time-comparison/getTimeOffset.ts           |  3 +-
 .../src/utils/convertKeysToCamelCase.ts            |  4 +--
 .../packages/superset-ui-core/src/utils/merge.ts   |  2 +-
 .../src/DeckGLContainer.tsx                        |  2 +-
 .../legacy-preset-chart-deckgl/src/Multi/Multi.tsx |  2 +-
 .../legacy-preset-chart-deckgl/src/factory.tsx     |  2 +-
 .../src/utilities/HandlebarsRenderer.tsx           |  2 +-
 .../src/utilities/TooltipTemplateControl.tsx       |  2 +-
 .../legacy-preset-chart-nvd3/src/NVD3Vis.js        |  2 +-
 .../src/AgGridTable/index.tsx                      |  2 +-
 .../src/AgGridTableChart.tsx                       |  2 +-
 .../plugin-chart-ag-grid-table/src/buildQuery.ts   |  7 ++---
 .../src/controlPanel.tsx                           |  5 ++--
 .../src/transformProps.ts                          |  2 +-
 .../plugin-chart-ag-grid-table/src/utils/extent.ts |  2 +-
 .../src/utils/getInitialFilterModel.ts             |  2 +-
 .../src/components/OlChartMap.tsx                  |  2 +-
 .../src/util/transformPropsUtil.ts                 |  2 +-
 .../BigNumber/BigNumberPeriodOverPeriod/PopKPI.tsx |  2 +-
 .../BigNumberPeriodOverPeriod/buildQuery.ts        |  2 +-
 .../BigNumberPeriodOverPeriod/controlPanel.ts      |  2 +-
 .../useOverflowDetection.ts                        |  2 +-
 .../src/Gauge/transformProps.ts                    |  5 ++--
 .../src/Heatmap/transformProps.ts                  |  2 +-
 .../src/Histogram/transformProps.ts                |  2 +-
 .../src/MixedTimeseries/controlPanel.tsx           |  2 +-
 .../src/MixedTimeseries/transformProps.ts          |  2 +-
 .../src/Timeseries/transformProps.ts               |  2 +-
 .../plugin-chart-echarts/src/utils/annotation.ts   |  2 +-
 .../plugin-chart-echarts/src/utils/series.ts       |  9 +++++-
 .../plugin-chart-echarts/src/utils/treeBuilder.ts  |  2 +-
 .../plugin-chart-echarts/test/utils/series.test.ts |  2 +-
 .../src/components/Handlebars/HandlebarsViewer.tsx |  2 +-
 .../plugins/plugin-chart-handlebars/src/consts.ts  |  2 +-
 .../src/plugin/controls/orderBy.tsx                |  2 +-
 .../plugin-chart-table/src/DataTable/DataTable.tsx |  2 +-
 .../plugins/plugin-chart-table/src/TableChart.tsx  |  3 +-
 .../plugins/plugin-chart-table/src/buildQuery.ts   |  2 +-
 .../plugin-chart-table/src/controlPanel.tsx        |  3 +-
 .../plugin-chart-table/src/transformProps.ts       |  2 +-
 .../plugins/plugin-chart-table/src/utils/extent.ts |  2 +-
 .../plugin-chart-table/test/TableChart.test.tsx    |  2 +-
 .../src/chart/WordCloud.tsx                        |  2 +-
 .../plugin/controls/ColorSchemeControl/index.tsx   |  2 +-
 .../src/SqlLab/components/App/index.tsx            |  4 +--
 .../src/SqlLab/components/AppLayout/index.tsx      |  3 +-
 .../src/SqlLab/components/ResultSet/index.tsx      |  2 +-
 .../SqlLab/components/SqlEditorLeftBar/index.tsx   |  3 +-
 .../src/SqlLab/components/TableElement/index.tsx   |  2 +-
 .../components/TemplateParamsEditor/index.tsx      |  2 +-
 .../components/Chart/DrillBy/DrillBySubmenu.tsx    |  2 +-
 .../DashboardBuilder/DashboardWrapper.tsx          |  2 +-
 .../src/dashboard/components/dnd/handleHover.ts    |  2 +-
 .../components/gridComponents/Chart/Chart.jsx      |  2 +-
 .../FilterBar/FilterControls/utils.ts              |  2 +-
 .../nativeFilters/FilterBar/Vertical.tsx           |  2 +-
 .../FiltersConfigModal/FiltersConfigForm/utils.ts  |  2 +-
 .../explore/components/DataTableControl/index.tsx  |  2 +-
 .../controls/ColorSchemeControl/index.tsx          |  2 +-
 .../ColumnConfigControl/ControlForm/index.tsx      |  2 +-
 .../DndColumnMetricSelect.tsx                      | 12 ++++----
 .../useAdvancedDataTypes.ts                        |  2 +-
 .../components/controls/TextAreaControl.tsx        |  2 +-
 .../components/controls/TextControl/index.tsx      |  2 +-
 .../getControlValuesCompatibleWithDatasource.ts    |  2 +-
 superset-frontend/src/features/home/SubMenu.tsx    |  2 +-
 .../src/features/reports/ReportModal/actions.js    |  2 +-
 .../filters/components/Range/RangeFilterPlugin.tsx |  5 ++--
 .../components/Select/SelectFilterPlugin.tsx       |  4 +--
 superset-frontend/src/types/bootstrapTypes.ts      |  2 +-
 .../src/utils/DebouncedMessageQueue.ts             |  2 +-
 superset-frontend/src/utils/downloadAsImage.tsx    |  2 +-
 superset-frontend/src/utils/downloadAsPdf.ts       |  2 +-
 superset-frontend/src/utils/urlUtils.ts            |  2 +-
 superset-websocket/package-lock.json               | 35 ++++++++++++----------
 superset-websocket/package.json                    |  3 +-
 superset-websocket/src/config.ts                   |  2 +-
 100 files changed, 157 insertions(+), 137 deletions(-)

diff --git a/superset-frontend/package-lock.json 
b/superset-frontend/package-lock.json
index cab35a7ff04..c233295d9e4 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -69,6 +69,7 @@
         "dom-to-image-more": "^3.7.2",
         "dom-to-pdf": "^0.3.2",
         "echarts": "^5.6.0",
+        "es-toolkit": "^1.44.0",
         "eslint-plugin-i18n-strings": 
"file:eslint-rules/eslint-plugin-i18n-strings",
         "fast-glob": "^3.3.2",
         "fs-extra": "^11.3.3",
@@ -30108,6 +30109,16 @@
         "url": "https://github.com/sponsors/ljharb";
       }
     },
+    "node_modules/es-toolkit": {
+      "version": "1.44.0",
+      "resolved": 
"https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz";,
+      "integrity": 
"sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==",
+      "license": "MIT",
+      "workspaces": [
+        "docs",
+        "benchmarks"
+      ]
+    },
     "node_modules/es6-error": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz";,
@@ -63629,10 +63640,10 @@
         "d3-time-format": "^4.1.0",
         "dayjs": "^1.11.19",
         "dompurify": "^3.3.1",
+        "es-toolkit": "^1.44.0",
         "fetch-retry": "^6.0.0",
         "handlebars": "^4.7.8",
         "jed": "^1.1.1",
-        "lodash": "^4.17.23",
         "math-expression-evaluator": "^2.0.7",
         "pretty-ms": "^9.3.0",
         "re-resizable": "^6.11.2",
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index 30ef0d1d669..fa26b03cb49 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -150,6 +150,7 @@
     "dom-to-image-more": "^3.7.2",
     "dom-to-pdf": "^0.3.2",
     "echarts": "^5.6.0",
+    "es-toolkit": "^1.44.0",
     "eslint-plugin-i18n-strings": 
"file:eslint-rules/eslint-plugin-i18n-strings",
     "fast-glob": "^3.3.2",
     "fs-extra": "^11.3.3",
diff --git a/superset-frontend/packages/superset-core/src/ui/theme/Theme.tsx 
b/superset-frontend/packages/superset-core/src/ui/theme/Theme.tsx
index 6096d69bd7d..83127f23317 100644
--- a/superset-frontend/packages/superset-core/src/ui/theme/Theme.tsx
+++ b/superset-frontend/packages/superset-core/src/ui/theme/Theme.tsx
@@ -25,7 +25,7 @@ import {
   CacheProvider as EmotionCacheProvider,
 } from '@emotion/react';
 import createCache from '@emotion/cache';
-import { noop, mergeWith } from 'lodash';
+import { mergeWith } from 'es-toolkit/compat';
 import { GlobalStyles } from './GlobalStyles';
 import {
   AntdThemeConfig,
@@ -161,7 +161,7 @@ export class Theme {
     antdConfig: AntdThemeConfig,
     emotionCache: any,
   ): void {
-    noop(theme, antdConfig, emotionCache);
+    () => ({ theme, antdConfig, emotionCache });
     // Overridden at runtime by SupersetThemeProvider using setThemeState
   }
 
diff --git 
a/superset-frontend/packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx
 
b/superset-frontend/packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx
index 82de6b7cecc..1d246c88f72 100644
--- 
a/superset-frontend/packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx
+++ 
b/superset-frontend/packages/superset-ui-chart-controls/src/components/CertifiedIconWithTooltip.tsx
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { kebabCase } from 'lodash';
+import { kebabCase } from 'es-toolkit';
 import { t } from '@apache-superset/core';
 import { useTheme, styled } from '@apache-superset/core/ui';
 import { Tooltip } from '@superset-ui/core/components';
diff --git 
a/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts
 
b/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts
index ee4238a857c..816bff797ad 100644
--- 
a/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts
+++ 
b/superset-frontend/packages/superset-ui-chart-controls/src/operators/sortOperator.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitationsxw
  * under the License.
  */
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import {
   ensureIsArray,
   getMetricLabel,
diff --git 
a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx
 
b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx
index 0b9953b95a0..bb9cc3cd26f 100644
--- 
a/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx
+++ 
b/superset-frontend/packages/superset-ui-chart-controls/src/shared-controls/sharedControls.tsx
@@ -32,7 +32,7 @@
  * here's a list of the keys that are common to all controls, and as a result 
define the
  * control interface.
  */
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import { t } from '@apache-superset/core';
 import {
   getCategoricalSchemeRegistry,
diff --git 
a/superset-frontend/packages/superset-ui-chart-controls/test/operators/histogramOperator.test.ts
 
b/superset-frontend/packages/superset-ui-chart-controls/test/operators/histogramOperator.test.ts
index b4f76f42016..52e754b8b88 100644
--- 
a/superset-frontend/packages/superset-ui-chart-controls/test/operators/histogramOperator.test.ts
+++ 
b/superset-frontend/packages/superset-ui-chart-controls/test/operators/histogramOperator.test.ts
@@ -18,7 +18,7 @@
  */
 import { histogramOperator } from '@superset-ui/chart-controls';
 import { SqlaFormData, VizType } from '@superset-ui/core';
-import { omit } from 'lodash';
+import { omit } from 'es-toolkit';
 
 const formData: SqlaFormData = {
   bins: 5,
diff --git a/superset-frontend/packages/superset-ui-core/package.json 
b/superset-frontend/packages/superset-ui-core/package.json
index 52dc747f816..37c141263b3 100644
--- a/superset-frontend/packages/superset-ui-core/package.json
+++ b/superset-frontend/packages/superset-ui-core/package.json
@@ -45,7 +45,7 @@
     "fetch-retry": "^6.0.0",
     "handlebars": "^4.7.8",
     "jed": "^1.1.1",
-    "lodash": "^4.17.23",
+    "es-toolkit": "^1.44.0",
     "math-expression-evaluator": "^2.0.7",
     "pretty-ms": "^9.3.0",
     "re-resizable": "^6.11.2",
diff --git 
a/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorNamespace.ts
 
b/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorNamespace.ts
index 9389ad549fd..5e72de63460 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorNamespace.ts
+++ 
b/superset-frontend/packages/superset-ui-core/src/color/CategoricalColorNamespace.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'es-toolkit';
 import CategoricalColorScale from './CategoricalColorScale';
 import { ColorsLookup } from './types';
 import getCategoricalSchemeRegistry from 
'./CategoricalSchemeRegistrySingleton';
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/DropdownButton/index.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/DropdownButton/index.tsx
index e3ac5aa9b6f..1ea7a8e35b7 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/DropdownButton/index.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/DropdownButton/index.tsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { Dropdown } from 'antd';
-import { kebabCase } from 'lodash';
+import { kebabCase } from 'es-toolkit';
 import { css, useTheme } from '@apache-superset/core/ui';
 import { Tooltip } from '../Tooltip';
 import type { DropdownButtonProps } from './types';
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx
index 7a92df392df..6257748e7e9 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/DropdownContainer/DropdownContainer.stories.tsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { useRef, useCallback, useState } from 'react';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 import { css } from '@apache-superset/core/ui';
 import { Button } from '../Button';
 import { Select } from '../Select';
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/InfoTooltip/index.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/InfoTooltip/index.tsx
index 553ac193084..09be66e5b0b 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/InfoTooltip/index.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/InfoTooltip/index.tsx
@@ -18,7 +18,7 @@
  */
 import { KeyboardEvent, useMemo } from 'react';
 import { SerializedStyles, CSSObject } from '@emotion/react';
-import { kebabCase } from 'lodash';
+import { kebabCase } from 'es-toolkit';
 import { t } from '@apache-superset/core';
 import { css, useTheme, getFontSize } from '@apache-superset/core/ui';
 import {
@@ -118,7 +118,7 @@ export const InfoTooltip = ({
 
   return (
     <Tooltip
-      id={`${kebabCase(label) || Math.floor(Math.random() * 10000)}-tooltip`}
+      id={`${kebabCase(label ?? '') || Math.floor(Math.random() * 
10000)}-tooltip`}
       title={tooltip}
       placement={placement}
     >
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx
index 3f0f0e3a07b..a2d69e383f5 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/MetadataBar/MetadataBar.tsx
@@ -18,7 +18,7 @@
  */
 import { useCallback, useEffect, useRef, useState } from 'react';
 import { useResizeDetector } from 'react-resize-detector';
-import { uniqWith } from 'lodash';
+import { uniqWith } from 'es-toolkit';
 import { styled } from '@apache-superset/core/ui';
 import { Tooltip } from '../Tooltip';
 import { TooltipPlacement } from '../Tooltip/types';
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx 
b/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx
index 021341808e0..577d35ece75 100644
--- a/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx
+++ b/superset-frontend/packages/superset-ui-core/src/components/Modal/Modal.tsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { isValidElement, cloneElement, useMemo, useRef, useState } from 
'react';
-import { isNil } from 'lodash';
+import { isNil } from 'es-toolkit';
 import { t } from '@apache-superset/core';
 import { css, styled, useTheme } from '@apache-superset/core/ui';
 import { Modal as AntdModal, ModalProps as AntdModalProps } from 'antd';
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/SafeMarkdown/SafeMarkdown.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/SafeMarkdown/SafeMarkdown.tsx
index d1f49c428c3..2959de583a4 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/SafeMarkdown/SafeMarkdown.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/SafeMarkdown/SafeMarkdown.tsx
@@ -22,7 +22,7 @@ import rehypeSanitize, { defaultSchema } from 
'rehype-sanitize';
 // remark-gfm v4+ requires react-markdown v9+, which requires React 18.
 // Currently pinned to v3.0.1 for compatibility with react-markdown v8 and 
React 17.
 import remarkGfm from 'remark-gfm';
-import { mergeWith } from 'lodash';
+import { mergeWith } from 'es-toolkit/compat';
 import { FeatureFlag, isFeatureEnabled } from '../../utils';
 
 interface SafeMarkdownProps {
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/Select/AsyncSelect.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/Select/AsyncSelect.tsx
index bfa2e801a30..143fe6042f4 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/Select/AsyncSelect.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/Select/AsyncSelect.tsx
@@ -41,7 +41,7 @@ import {
   LabeledValue as AntdLabeledValue,
   RefSelectProps,
 } from 'antd/es/select';
-import { debounce, isEqual, uniq } from 'lodash';
+import { debounce, isEqual, uniq } from 'es-toolkit';
 import { Constants, Icons } from '@superset-ui/core/components';
 import { Space } from '../Space';
 import {
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/Select/Select.stories.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/Select/Select.stories.tsx
index 3323a487281..5fd36bce91f 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/Select/Select.stories.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/Select/Select.stories.tsx
@@ -17,7 +17,6 @@
  * under the License.
  */
 import { StoryObj } from '@storybook/react';
-import { noop } from 'lodash';
 import { SelectOptionsType, SelectProps } from './types';
 import { Select } from '.';
 
@@ -95,7 +94,7 @@ export const InteractiveSelect: StoryObj = {
     optionsCount,
     ...args
   }: SelectProps & { header: string; optionsCount: number }) => {
-    noop(header);
+    () => header;
     return (
       <div
         style={{
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/Select/Select.tsx 
b/superset-frontend/packages/superset-ui-core/src/components/Select/Select.tsx
index 222ba643bcd..02d5d9bf6af 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/Select/Select.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/Select/Select.tsx
@@ -37,7 +37,7 @@ import {
   LabeledValue as AntdLabeledValue,
   RefSelectProps,
 } from 'antd/es/select';
-import { debounce, isEqual, uniq } from 'lodash';
+import { debounce, isEqual, uniq } from 'es-toolkit';
 import {
   dropDownRenderHelper,
   getOption,
diff --git 
a/superset-frontend/packages/superset-ui-core/src/components/TableView/TableView.tsx
 
b/superset-frontend/packages/superset-ui-core/src/components/TableView/TableView.tsx
index 4544013b34c..79706b579a0 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/components/TableView/TableView.tsx
+++ 
b/superset-frontend/packages/superset-ui-core/src/components/TableView/TableView.tsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { memo, useEffect, useRef, useMemo, useCallback } from 'react';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 import { styled } from '@apache-superset/core/ui';
 import { useFilters, usePagination, useSortBy, useTable } from 'react-table';
 import { Empty } from '@superset-ui/core/components';
diff --git 
a/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
 
b/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
index 4ee81b80b3a..d0d69b1b172 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
+++ 
b/superset-frontend/packages/superset-ui-core/src/connection/callApi/parseResponse.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 import _JSONbig from 'json-bigint';
-import { cloneDeepWith } from 'lodash';
+import { cloneDeepWith } from 'es-toolkit';
 
 import { ParseMethod, TextResponse, JsonResponse } from '../types';
 
diff --git 
a/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts 
b/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts
index 840cf4c1a18..305793d8fca 100644
--- a/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts
+++ b/superset-frontend/packages/superset-ui-core/src/query/normalizeOrderBy.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 
 import { QueryObject } from './types';
 
diff --git 
a/superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts 
b/superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts
index b5bde0c88db..85493fa9e07 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts
+++ 
b/superset-frontend/packages/superset-ui-core/src/query/normalizeTimeColumn.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { omit } from 'lodash';
+import { omit } from 'es-toolkit';
 
 import {
   AdhocColumn,
diff --git 
a/superset-frontend/packages/superset-ui-core/src/time-comparison/fetchTimeRange.ts
 
b/superset-frontend/packages/superset-ui-core/src/time-comparison/fetchTimeRange.ts
index 61c2a2f8ad3..ff1676f6827 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/time-comparison/fetchTimeRange.ts
+++ 
b/superset-frontend/packages/superset-ui-core/src/time-comparison/fetchTimeRange.ts
@@ -17,7 +17,6 @@
  * under the License.
  */
 import rison from 'rison';
-import { isEmpty } from 'lodash';
 import {
   SupersetClient,
   getClientErrorObject,
@@ -67,7 +66,7 @@ export const fetchTimeRange = async (
 ) => {
   let query;
   let endpoint;
-  if (!isEmpty(shifts)) {
+  if (shifts && shifts.length > 0) {
     const timeRanges = ensureIsArray(shifts).map(shift => ({
       timeRange,
       shift,
@@ -80,7 +79,7 @@ export const fetchTimeRange = async (
   }
   try {
     const response = await SupersetClient.get({ endpoint });
-    if (isEmpty(shifts)) {
+    if (!shifts || shifts.length === 0) {
       const timeRangeString = buildTimeRangeString(
         response?.json?.result[0]?.since || '',
         response?.json?.result[0]?.until || '',
diff --git 
a/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts
 
b/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts
index b8f970dc100..700273df3e3 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts
+++ 
b/superset-frontend/packages/superset-ui-core/src/time-comparison/getTimeOffset.ts
@@ -16,7 +16,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { isEmpty } from 'lodash';
 import { ensureIsArray } from '../utils';
 import { customTimeRangeDecode } from './customTimeRangeDecode';
 
@@ -116,7 +115,7 @@ export const parseDttmToDate = (
   }
   const parts = dttm?.split('-');
   let parsed: Date | null = null;
-  if (parts && !isEmpty(parts)) {
+  if (parts && parts.length > 0) {
     if (parts.length === 1) {
       parsed = new Date(Date.UTC(parseInt(parts[0], 10), 0));
     } else if (parts.length === 2) {
diff --git 
a/superset-frontend/packages/superset-ui-core/src/utils/convertKeysToCamelCase.ts
 
b/superset-frontend/packages/superset-ui-core/src/utils/convertKeysToCamelCase.ts
index fb39add6095..038b92ff76e 100644
--- 
a/superset-frontend/packages/superset-ui-core/src/utils/convertKeysToCamelCase.ts
+++ 
b/superset-frontend/packages/superset-ui-core/src/utils/convertKeysToCamelCase.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { camelCase, isPlainObject, mapKeys } from 'lodash';
+import { camelCase, isPlainObject, mapKeys } from 'es-toolkit';
 
 export default function convertKeysToCamelCase<T>(object: T) {
   if (object === null || object === undefined) {
@@ -26,7 +26,7 @@ export default function convertKeysToCamelCase<T>(object: T) {
   if (isPlainObject(object)) {
     // eslint-disable-next-line @typescript-eslint/no-explicit-any
     return mapKeys(object as { [key: string]: any }, (_, k) =>
-      camelCase(k),
+      camelCase(String(k)),
     ) as T;
   }
   throw new Error(`Cannot convert input that is not a plain object: 
${object}`);
diff --git a/superset-frontend/packages/superset-ui-core/src/utils/merge.ts 
b/superset-frontend/packages/superset-ui-core/src/utils/merge.ts
index bde3783f908..afccf2e2a89 100644
--- a/superset-frontend/packages/superset-ui-core/src/utils/merge.ts
+++ b/superset-frontend/packages/superset-ui-core/src/utils/merge.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { mergeWith } from 'lodash';
+import { mergeWith } from 'es-toolkit/compat';
 
 /**
  * Merges objects using lodash.mergeWith, but replaces arrays instead of 
concatenating them.
diff --git 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/DeckGLContainer.tsx 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/DeckGLContainer.tsx
index b22de708785..d4a55fe6fab 100644
--- 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/DeckGLContainer.tsx
+++ 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/DeckGLContainer.tsx
@@ -32,7 +32,7 @@ import {
   isValidElement,
   useRef,
 } from 'react';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 import { StaticMap } from 'react-map-gl';
 import DeckGL from '@deck.gl/react';
 import type { Layer } from '@deck.gl/core';
diff --git 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/Multi.tsx 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/Multi.tsx
index 1ee7ee12707..9b416c3f4f0 100644
--- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/Multi.tsx
+++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/Multi/Multi.tsx
@@ -21,7 +21,7 @@
  */
 import { memo, useCallback, useEffect, useMemo, useRef, useState } from 
'react';
 import { useSelector } from 'react-redux';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 import { createSelector } from '@reduxjs/toolkit';
 import {
   AdhocFilter,
diff --git 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/factory.tsx 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/factory.tsx
index bc48a52a377..9129949597b 100644
--- a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/factory.tsx
+++ b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/factory.tsx
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { memo, useCallback, useEffect, useRef, useState } from 'react';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 import type { Layer } from '@deck.gl/core';
 import {
   Datasource,
diff --git 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/HandlebarsRenderer.tsx
 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/HandlebarsRenderer.tsx
index 7666ec31441..efbe431ee02 100644
--- 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/HandlebarsRenderer.tsx
+++ 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/HandlebarsRenderer.tsx
@@ -22,7 +22,7 @@ import { sanitizeHtml } from '@superset-ui/core';
 import { styled } from '@apache-superset/core/ui';
 import { extendedDayjs as dayjs } from '@superset-ui/core/utils/dates';
 import Handlebars from 'handlebars';
-import { isPlainObject } from 'lodash';
+import { isPlainObject } from 'es-toolkit';
 
 export interface HandlebarsRendererProps {
   templateSource: string;
diff --git 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/TooltipTemplateControl.tsx
 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/TooltipTemplateControl.tsx
index 5c03826029d..f06330dc8cf 100644
--- 
a/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/TooltipTemplateControl.tsx
+++ 
b/superset-frontend/plugins/legacy-preset-chart-deckgl/src/utilities/TooltipTemplateControl.tsx
@@ -18,7 +18,7 @@
  */
 
 import { useCallback } from 'react';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { t } from '@apache-superset/core';
 import { useTheme } from '@apache-superset/core/ui';
 import { InfoTooltip, Constants } from '@superset-ui/core/components';
diff --git a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js 
b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js
index 1b1bd1fedf3..c87a650efec 100644
--- a/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js
+++ b/superset-frontend/plugins/legacy-preset-chart-nvd3/src/NVD3Vis.js
@@ -17,7 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { kebabCase, throttle } from 'lodash';
+import { kebabCase, throttle } from 'es-toolkit';
 import d3 from 'd3';
 import utc from 'dayjs/plugin/utc';
 import nv from 'nvd3-fork';
diff --git 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/index.tsx
 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/index.tsx
index c51f88ef0ef..40ff6c90e20 100644
--- 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/index.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTable/index.tsx
@@ -50,7 +50,7 @@ import {
   JsonObject,
 } from '@superset-ui/core';
 import { SearchOutlined } from '@ant-design/icons';
-import { debounce, isEqual } from 'lodash';
+import { debounce, isEqual } from 'es-toolkit';
 import Pagination from './components/Pagination';
 import SearchSelectDropdown from './components/SearchSelectDropdown';
 import { SearchOption, SortByItem } from '../types';
diff --git 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTableChart.tsx 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTableChart.tsx
index 2944477696e..6afc4208068 100644
--- 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTableChart.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/AgGridTableChart.tsx
@@ -24,7 +24,7 @@ import {
 } from '@superset-ui/core';
 import { GenericDataType } from '@apache-superset/core/api/core';
 import { useCallback, useEffect, useState, useMemo } from 'react';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 
 import {
   CellClickedEvent,
diff --git 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/buildQuery.ts 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/buildQuery.ts
index 9212936686b..c1144e622f7 100644
--- a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/buildQuery.ts
+++ b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/buildQuery.ts
@@ -38,7 +38,6 @@ import {
   isTimeComparison,
   timeCompareOperator,
 } from '@superset-ui/chart-controls';
-import { isEmpty } from 'lodash';
 import { TableChartFormData } from './types';
 import { updateTableOwnState } from './utils/externalAPIs';
 
@@ -102,7 +101,7 @@ const buildQuery: BuildQuery<TableChartFormData> = (
     // Shifts for non-custom or non inherit time comparison
     if (
       isTimeComparison(formData, baseQueryObject) &&
-      !isEmpty(nonCustomNorInheritShifts)
+      nonCustomNorInheritShifts.length > 0
     ) {
       timeOffsets = nonCustomNorInheritShifts;
     }
@@ -110,7 +109,7 @@ const buildQuery: BuildQuery<TableChartFormData> = (
     // Shifts for custom or inherit time comparison
     if (
       isTimeComparison(formData, baseQueryObject) &&
-      !isEmpty(customOrInheritShifts)
+      nonCustomNorInheritShifts.length > 0
     ) {
       if (customOrInheritShifts.includes('custom')) {
         timeOffsets = timeOffsets.concat([formData.start_date_offset]);
@@ -168,7 +167,7 @@ const buildQuery: BuildQuery<TableChartFormData> = (
         ];
       }
       // Add the operator for the time comparison if some is selected
-      if (!isEmpty(timeOffsets)) {
+      if (timeOffsets.length > 0) {
         postProcessing.push(timeCompareOperator(formData, baseQueryObject));
       }
 
diff --git 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/controlPanel.tsx 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/controlPanel.tsx
index 1277a8f7f38..41475660831 100644
--- a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/controlPanel.tsx
@@ -53,7 +53,8 @@ import {
   validateServerPagination,
 } from '@superset-ui/core';
 import { GenericDataType } from '@apache-superset/core/api/core';
-import { isEmpty, last } from 'lodash';
+import { last } from 'es-toolkit';
+import { isEmpty } from 'es-toolkit/compat';
 import { PAGE_SIZE_OPTIONS, SERVER_PAGE_SIZE_OPTIONS } from './consts';
 import { ColorSchemeEnum } from './types';
 
@@ -518,7 +519,7 @@ const config: ControlPanelConfig = {
                 const childColumnMap: Record<string, boolean> = {};
                 const timeComparisonColumnMap: Record<string, boolean> = {};
 
-                if (!isEmpty(timeComparisonValue)) {
+                if (timeComparisonValue) {
                   /**
                    * Replace numeric columns with sets of comparison columns.
                    */
diff --git 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/transformProps.ts 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/transformProps.ts
index 73cee040fa9..9d412b75e23 100644
--- a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/transformProps.ts
@@ -36,7 +36,7 @@ import {
   TimeFormatter,
 } from '@superset-ui/core';
 import { GenericDataType } from '@apache-superset/core/api/core';
-import { isEmpty, isEqual, merge } from 'lodash';
+import { isEmpty, isEqual, merge } from 'es-toolkit/compat';
 import {
   ConditionalFormattingConfig,
   getColorFormatters,
diff --git 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/extent.ts 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/extent.ts
index 4b326800d2f..a63bbf89fed 100644
--- a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/extent.ts
+++ b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/extent.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { isNil } from 'lodash';
+import { isNil } from 'es-toolkit';
 
 export default function extent<T = number | string | Date | undefined | null>(
   values: T[],
diff --git 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/getInitialFilterModel.ts
 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/getInitialFilterModel.ts
index bfe3c054be4..6132a4ee10d 100644
--- 
a/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/getInitialFilterModel.ts
+++ 
b/superset-frontend/plugins/plugin-chart-ag-grid-table/src/utils/getInitialFilterModel.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import type { AgGridChartState } from '@superset-ui/core';
 
 const getInitialFilterModel = (
diff --git 
a/superset-frontend/plugins/plugin-chart-cartodiagram/src/components/OlChartMap.tsx
 
b/superset-frontend/plugins/plugin-chart-cartodiagram/src/components/OlChartMap.tsx
index 89b097e8992..38762792103 100644
--- 
a/superset-frontend/plugins/plugin-chart-cartodiagram/src/components/OlChartMap.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-cartodiagram/src/components/OlChartMap.tsx
@@ -24,7 +24,7 @@ import { View } from 'ol';
 import BaseEvent from 'ol/events/Event';
 import { unByKey } from 'ol/Observable';
 import { toLonLat } from 'ol/proj';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { fitMapToCharts } from '../util/mapUtil';
 import { ChartLayer } from './ChartLayer';
 import { createLayer } from '../util/layerUtil';
diff --git 
a/superset-frontend/plugins/plugin-chart-cartodiagram/src/util/transformPropsUtil.ts
 
b/superset-frontend/plugins/plugin-chart-cartodiagram/src/util/transformPropsUtil.ts
index fb416005739..e6fabe71303 100644
--- 
a/superset-frontend/plugins/plugin-chart-cartodiagram/src/util/transformPropsUtil.ts
+++ 
b/superset-frontend/plugins/plugin-chart-cartodiagram/src/util/transformPropsUtil.ts
@@ -22,7 +22,7 @@ import {
   convertKeysToCamelCase,
   DataRecord,
 } from '@superset-ui/core';
-import { isObject } from 'lodash';
+import { isObject } from 'es-toolkit/compat';
 import {
   LocationConfigMapping,
   SelectedChartConfig,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/PopKPI.tsx
 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/PopKPI.tsx
index 170fa261907..3950800a383 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/PopKPI.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/PopKPI.tsx
@@ -26,7 +26,7 @@ import {
 import { css, styled, useTheme } from '@apache-superset/core/ui';
 import { Tooltip } from '@superset-ui/core/components';
 import { DEFAULT_DATE_PATTERN } from '@superset-ui/chart-controls';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import {
   ColorSchemeEnum,
   PopKPIComparisonSymbolStyleProps,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts
index e230097e266..5a0499a24a4 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/buildQuery.ts
@@ -26,7 +26,7 @@ import {
   isTimeComparison,
   timeCompareOperator,
 } from '@superset-ui/chart-controls';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 
 export default function buildQuery(formData: QueryFormData) {
   const { cols: groupby } = formData;
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts
index 51571de05d6..bbad134c2bb 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/controlPanel.ts
@@ -24,7 +24,7 @@ import {
   sharedControls,
   sections,
 } from '@superset-ui/chart-controls';
-import { noop } from 'lodash';
+import { noop } from 'es-toolkit/compat';
 import {
   headerFontSize,
   subheaderFontSize,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/useOverflowDetection.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/useOverflowDetection.ts
index 42cda225d3c..70a99bdfe8e 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/useOverflowDetection.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberPeriodOverPeriod/useOverflowDetection.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { useEffect, useRef, useState } from 'react';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 
 export const useOverflowDetection = (flexGap: number) => {
   const symbolContainerRef = useRef<HTMLDivElement>(null);
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts 
b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts
index cd4f2610f7d..0375a4002a8 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/Gauge/transformProps.ts
@@ -30,7 +30,7 @@ import type { EChartsCoreOption } from 'echarts/core';
 import type { GaugeSeriesOption } from 'echarts/charts';
 import type { GaugeDataItemOption } from 
'echarts/types/src/chart/gauge/GaugeSeries';
 import type { CallbackDataParams } from 'echarts/types/src/util/types';
-import { range } from 'lodash';
+import { range } from 'es-toolkit/compat';
 import { parseNumbersList } from '../utils/controls';
 import {
   DEFAULT_FORM_DATA as DEFAULT_GAUGE_FORM_DATA,
@@ -242,7 +242,8 @@ export default function transformProps(
   const max = isValidNumber(maxVal)
     ? Number(maxVal)
     : calculateMax(transformedData);
-  const axisLabels = range(min, max, (max - min) / splitNumber);
+  const step = (max - min) / splitNumber;
+  const axisLabels = range(min, max, step);
   const axisLabelLength = Math.max(
     ...axisLabels.map(label => numberFormatter(label).length).concat([1]),
   );
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts 
b/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts
index 118082015cd..62149604382 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/Heatmap/transformProps.ts
@@ -32,7 +32,7 @@ import {
 import { logging } from '@apache-superset/core';
 import { GenericDataType } from '@apache-superset/core/api/core';
 import memoizeOne from 'memoize-one';
-import { maxBy, minBy } from 'lodash';
+import { maxBy, minBy } from 'es-toolkit/compat';
 import type { ComposeOption } from 'echarts/core';
 import type { HeatmapSeriesOption } from 'echarts/charts';
 import type { CallbackDataParams } from 'echarts/types/src/util/types';
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/Histogram/transformProps.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/src/Histogram/transformProps.ts
index 28d2a93e6d1..82747e18426 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/Histogram/transformProps.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/Histogram/transformProps.ts
@@ -20,7 +20,7 @@ import type { ComposeOption } from 'echarts/core';
 import type { BarSeriesOption } from 'echarts/charts';
 import type { GridComponentOption } from 'echarts/components';
 import type { CallbackDataParams } from 'echarts/types/src/util/types';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import {
   CategoricalColorNamespace,
   NumberFormats,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx
 
b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx
index 0ec6080c50f..61ca8fff0a1 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/controlPanel.tsx
@@ -18,7 +18,7 @@
  */
 import { t } from '@apache-superset/core';
 import { ensureIsArray } from '@superset-ui/core';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'es-toolkit';
 import {
   ControlPanelsContainerProps,
   ControlPanelConfig,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts
index 3a9f945465f..d7b80304120 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/MixedTimeseries/transformProps.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 /* eslint-disable camelcase */
-import { invert } from 'lodash';
+import { invert } from 'es-toolkit/compat';
 import {
   AnnotationLayer,
   AxisType,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
index 6ebc30fc226..eb508385670 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/Timeseries/transformProps.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 /* eslint-disable camelcase */
-import { invert } from 'lodash';
+import { invert } from 'es-toolkit/compat';
 import { t } from '@apache-superset/core';
 import {
   AnnotationLayer,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts 
b/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts
index 90a450c3c3a..aad18711473 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/annotation.ts
@@ -17,7 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 
 import {
   Annotation,
diff --git a/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts 
b/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts
index 5befd6ab542..185436919c9 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/series.ts
@@ -37,7 +37,14 @@ import { SortSeriesType, LegendPaddingType } from 
'@superset-ui/chart-controls';
 import { format } from 'echarts/core';
 import type { LegendComponentOption } from 'echarts/components';
 import type { SeriesOption } from 'echarts';
-import { isEmpty, maxBy, meanBy, minBy, orderBy, sumBy } from 'lodash';
+import {
+  isEmpty,
+  maxBy,
+  meanBy,
+  minBy,
+  orderBy,
+  sumBy,
+} from 'es-toolkit/compat';
 import {
   NULL_STRING,
   StackControlsValue,
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts 
b/superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts
index 919d6e6db6a..4d64907d78a 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/src/utils/treeBuilder.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 import { DataRecord, DataRecordValue } from '@superset-ui/core';
-import { groupBy as _groupBy, transform } from 'lodash';
+import { groupBy as _groupBy, transform } from 'es-toolkit/compat';
 
 export type TreeNode = {
   name: DataRecordValue;
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts 
b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
index 6a1931a2378..7c619d189c5 100644
--- a/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
+++ b/superset-frontend/plugins/plugin-chart-echarts/test/utils/series.test.ts
@@ -263,7 +263,7 @@ test('sortRows by max descending', () => {
   ]);
 });
 
-test('sortAndFilterSeries by min ascending', () => {
+test.only('sortAndFilterSeries by min ascending', () => {
   expect(
     sortAndFilterSeries(sortData, 'my_x_axis', [], SortSeriesType.Min, true),
   ).toEqual(['y', 'x', 'z']);
diff --git 
a/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx
 
b/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx
index 006409c6ec9..06ac04a21e8 100644
--- 
a/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-handlebars/src/components/Handlebars/HandlebarsViewer.tsx
@@ -22,7 +22,7 @@ import { SafeMarkdown } from '@superset-ui/core/components';
 import { extendedDayjs as dayjs } from '@superset-ui/core/utils/dates';
 import Handlebars from 'handlebars';
 import { useMemo, useState } from 'react';
-import { isPlainObject } from 'lodash';
+import { isPlainObject } from 'es-toolkit';
 import Helpers from 'just-handlebars-helpers';
 import HandlebarsGroupBy from 'handlebars-group-by';
 
diff --git a/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts 
b/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts
index 8b722af5435..27d50d11961 100644
--- a/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts
+++ b/superset-frontend/plugins/plugin-chart-handlebars/src/consts.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { Constants } from '@superset-ui/core/components';
 
 export const debounceFunc = debounce(
diff --git 
a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx
 
b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx
index 84feb76ebd2..78b477364b9 100644
--- 
a/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-handlebars/src/plugin/controls/orderBy.tsx
@@ -18,7 +18,7 @@
  */
 import { ControlSetItem, Dataset } from '@superset-ui/chart-controls';
 import { t } from '@apache-superset/core';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import { isAggMode, isRawMode } from './shared';
 
 export const orderByControlSetItem: ControlSetItem = {
diff --git 
a/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx 
b/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx
index 553a2608599..ae76090dba9 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx
+++ b/superset-frontend/plugins/plugin-chart-table/src/DataTable/DataTable.tsx
@@ -42,7 +42,7 @@ import {
   Row,
 } from 'react-table';
 import { matchSorter, rankings } from 'match-sorter';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 import { Flex, Space } from '@superset-ui/core/components';
 import GlobalFilter, { GlobalFilterProps } from './components/GlobalFilter';
 import SelectPageSize, {
diff --git a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx 
b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx
index 259535d7325..6b1638d5dd6 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx
+++ b/superset-frontend/plugins/plugin-chart-table/src/TableChart.tsx
@@ -73,7 +73,8 @@ import {
   PlusCircleOutlined,
   TableOutlined,
 } from '@ant-design/icons';
-import { isEmpty, debounce, isEqual } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
+import { debounce, isEqual } from 'es-toolkit';
 import { ColorFormatters } from '@superset-ui/chart-controls';
 import {
   ColorSchemeEnum,
diff --git a/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts 
b/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts
index 7b3a952d891..f3f10a72984 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts
+++ b/superset-frontend/plugins/plugin-chart-table/src/buildQuery.ts
@@ -34,7 +34,7 @@ import {
   isTimeComparison,
   timeCompareOperator,
 } from '@superset-ui/chart-controls';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import { TableChartFormData } from './types';
 import { updateTableOwnState } from './DataTable/utils/externalAPIs';
 
diff --git a/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx 
b/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx
index 2d051cf97c9..2d1009f15c5 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx
+++ b/superset-frontend/plugins/plugin-chart-table/src/controlPanel.tsx
@@ -54,7 +54,8 @@ import {
   validateServerPagination,
 } from '@superset-ui/core';
 import { GenericDataType } from '@apache-superset/core/api/core';
-import { isEmpty, last } from 'lodash';
+import { last } from 'es-toolkit';
+import { isEmpty } from 'es-toolkit/compat';
 import { PAGE_SIZE_OPTIONS, SERVER_PAGE_SIZE_OPTIONS } from './consts';
 import { ColorSchemeEnum } from './types';
 
diff --git a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts 
b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
index cc92a19f85f..d0ea7873670 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
+++ b/superset-frontend/plugins/plugin-chart-table/src/transformProps.ts
@@ -43,7 +43,7 @@ import {
   getColorFormatters,
 } from '@superset-ui/chart-controls';
 
-import { isEmpty, merge } from 'lodash';
+import { isEmpty, merge } from 'es-toolkit/compat';
 import isEqualColumns from './utils/isEqualColumns';
 import DateWithFormatter from './utils/DateWithFormatter';
 import {
diff --git a/superset-frontend/plugins/plugin-chart-table/src/utils/extent.ts 
b/superset-frontend/plugins/plugin-chart-table/src/utils/extent.ts
index 4b326800d2f..a63bbf89fed 100644
--- a/superset-frontend/plugins/plugin-chart-table/src/utils/extent.ts
+++ b/superset-frontend/plugins/plugin-chart-table/src/utils/extent.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { isNil } from 'lodash';
+import { isNil } from 'es-toolkit';
 
 export default function extent<T = number | string | Date | undefined | null>(
   values: T[],
diff --git 
a/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx 
b/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx
index beac5a14f7c..fe0bf640343 100644
--- a/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx
+++ b/superset-frontend/plugins/plugin-chart-table/test/TableChart.test.tsx
@@ -24,7 +24,7 @@ import {
   waitFor,
   within,
 } from '@superset-ui/core/spec';
-import { cloneDeep } from 'lodash';
+import { cloneDeep } from 'es-toolkit';
 import TableChart, { sanitizeHeaderId } from '../src/TableChart';
 import { GenericDataType } from '@apache-superset/core/api/core';
 import transformProps from '../src/transformProps';
diff --git 
a/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx 
b/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx
index 6d1abedb774..260a0f3211a 100644
--- a/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx
+++ b/superset-frontend/plugins/plugin-chart-word-cloud/src/chart/WordCloud.tsx
@@ -21,7 +21,7 @@ import cloudLayout from 'd3-cloud';
 import { scaleLinear } from 'd3-scale';
 import { seed, CategoricalColorNamespace } from '@superset-ui/core';
 import { SupersetTheme, withTheme } from '@apache-superset/core/ui';
-import { isEqual } from 'lodash';
+import { isEqual } from 'es-toolkit';
 
 const seedRandom = seed('superset-ui');
 
diff --git 
a/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controls/ColorSchemeControl/index.tsx
 
b/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controls/ColorSchemeControl/index.tsx
index 7400b5358a3..ee683a1e447 100644
--- 
a/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controls/ColorSchemeControl/index.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-word-cloud/src/plugin/controls/ColorSchemeControl/index.tsx
@@ -27,7 +27,7 @@ import {
   CategoricalColorNamespace,
 } from '@superset-ui/core';
 import { css, useTheme } from '@apache-superset/core/ui';
-import { sortBy } from 'lodash';
+import { sortBy } from 'es-toolkit/compat';
 import { ControlHeader } from '@superset-ui/chart-controls';
 import {
   Tooltip,
diff --git a/superset-frontend/src/SqlLab/components/App/index.tsx 
b/superset-frontend/src/SqlLab/components/App/index.tsx
index efe9597c9f7..1e114ed6f9d 100644
--- a/superset-frontend/src/SqlLab/components/App/index.tsx
+++ b/superset-frontend/src/SqlLab/components/App/index.tsx
@@ -22,7 +22,7 @@ import { Redirect } from 'react-router-dom';
 import Mousetrap from 'mousetrap';
 import { t } from '@apache-superset/core';
 import { css, styled } from '@apache-superset/core/ui';
-import { throttle } from 'lodash';
+import { throttle } from 'es-toolkit';
 import {
   LOCALSTORAGE_MAX_USAGE_KB,
   LOCALSTORAGE_WARNING_THRESHOLD,
@@ -126,7 +126,7 @@ class App extends PureComponent<AppProps, AppState> {
     this.showLocalStorageUsageWarning = throttle(
       this.showLocalStorageUsageWarning,
       LOCALSTORAGE_WARNING_MESSAGE_THROTTLE_MS,
-      { trailing: false },
+      { edges: ['leading'] },
     );
   }
 
diff --git a/superset-frontend/src/SqlLab/components/AppLayout/index.tsx 
b/superset-frontend/src/SqlLab/components/AppLayout/index.tsx
index bb86e631eb0..9373dba3249 100644
--- a/superset-frontend/src/SqlLab/components/AppLayout/index.tsx
+++ b/superset-frontend/src/SqlLab/components/AppLayout/index.tsx
@@ -17,7 +17,6 @@
  * under the License.
  */
 import { useSelector } from 'react-redux';
-import { noop } from 'lodash';
 import type { SqlLabRootState } from 'src/SqlLab/types';
 import { css, styled } from '@apache-superset/core';
 import { useComponentDidUpdate } from '@superset-ui/core';
@@ -105,7 +104,7 @@ const AppLayout: React.FC = ({ children }) => {
         `}
         lazy
         onResizeEnd={onSidebarChange}
-        onResize={noop}
+        onResize={(_: number[]) => {}}
       >
         <Splitter.Panel
           collapsible={{
diff --git a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx 
b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx
index 3b751881031..8d42860e3a7 100644
--- a/superset-frontend/src/SqlLab/components/ResultSet/index.tsx
+++ b/superset-frontend/src/SqlLab/components/ResultSet/index.tsx
@@ -29,7 +29,7 @@ import {
 import AutoSizer from 'react-virtualized-auto-sizer';
 import { shallowEqual, useDispatch, useSelector } from 'react-redux';
 import { useHistory } from 'react-router-dom';
-import { pick } from 'lodash';
+import { pick } from 'es-toolkit';
 import {
   Button,
   ButtonGroup,
diff --git a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx 
b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx
index 5010298da0a..b36492c0ed8 100644
--- a/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx
+++ b/superset-frontend/src/SqlLab/components/SqlEditorLeftBar/index.tsx
@@ -32,7 +32,6 @@ import { t } from '@apache-superset/core';
 import { styled, css } from '@apache-superset/core/ui';
 import { TableSelectorMultiple } from 'src/components/TableSelector';
 import useQueryEditor from 'src/SqlLab/hooks/useQueryEditor';
-import { noop } from 'lodash';
 import TableElement from '../TableElement';
 import useDatabaseSelector from '../SqlEditorTopBar/useDatabaseSelector';
 
@@ -83,7 +82,7 @@ const SqlEditorLeftBar = ({ queryEditorId }: 
SqlEditorLeftBarProps) => {
     [allSelectedTables, dbId, schema],
   );
 
-  noop(_emptyResultsWithSearch); // This is to avoid unused variable warning, 
can be removed if not needed
+  _emptyResultsWithSearch; // This is to avoid unused variable warning, can be 
removed if not needed
 
   const onEmptyResults = useCallback((searchText?: string) => {
     setEmptyResultsWithSearch(!!searchText);
diff --git a/superset-frontend/src/SqlLab/components/TableElement/index.tsx 
b/superset-frontend/src/SqlLab/components/TableElement/index.tsx
index 6aa508902f0..76e43b875be 100644
--- a/superset-frontend/src/SqlLab/components/TableElement/index.tsx
+++ b/superset-frontend/src/SqlLab/components/TableElement/index.tsx
@@ -33,7 +33,7 @@ import {
 import { CopyToClipboard } from 'src/components';
 import { t } from '@apache-superset/core';
 import { styled, useTheme } from '@apache-superset/core/ui';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 
 import {
   removeDataPreview,
diff --git 
a/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx 
b/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx
index 402097d0a77..ea86ab5f324 100644
--- a/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx
+++ b/superset-frontend/src/SqlLab/components/TemplateParamsEditor/index.tsx
@@ -19,7 +19,7 @@
 import { useState, useEffect } from 'react';
 import { t } from '@apache-superset/core';
 import { styled } from '@apache-superset/core/ui';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import {
   Badge,
   ConfigEditor,
diff --git a/superset-frontend/src/components/Chart/DrillBy/DrillBySubmenu.tsx 
b/superset-frontend/src/components/Chart/DrillBy/DrillBySubmenu.tsx
index 9e3ebde3a07..68744fb27f4 100644
--- a/superset-frontend/src/components/Chart/DrillBy/DrillBySubmenu.tsx
+++ b/superset-frontend/src/components/Chart/DrillBy/DrillBySubmenu.tsx
@@ -43,7 +43,7 @@ import {
   Popover,
   Icons,
 } from '@superset-ui/core/components';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { FixedSizeList as List } from 'react-window';
 import { InputRef } from 'antd';
 import { MenuItemTooltip } from '../DisabledMenuItemTooltip';
diff --git 
a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardWrapper.tsx
 
b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardWrapper.tsx
index ec423b7bb03..ae640b101d8 100644
--- 
a/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardWrapper.tsx
+++ 
b/superset-frontend/src/dashboard/components/DashboardBuilder/DashboardWrapper.tsx
@@ -24,7 +24,7 @@ import { RootState } from 'src/dashboard/types';
 import { useSelector } from 'react-redux';
 import { useDragDropManager } from 'react-dnd';
 import classNames from 'classnames';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 
 const StyledDiv = styled.div`
   ${({ theme }) => css`
diff --git a/superset-frontend/src/dashboard/components/dnd/handleHover.ts 
b/superset-frontend/src/dashboard/components/dnd/handleHover.ts
index 7e25246e03d..7865d79aa2a 100644
--- a/superset-frontend/src/dashboard/components/dnd/handleHover.ts
+++ b/superset-frontend/src/dashboard/components/dnd/handleHover.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { throttle } from 'lodash';
+import { throttle } from 'es-toolkit';
 import { DropTargetMonitor } from 'react-dnd';
 import { DASHBOARD_ROOT_TYPE } from 'src/dashboard/util/componentTypes';
 import getDropPosition from 'src/dashboard/util/getDropPosition';
diff --git 
a/superset-frontend/src/dashboard/components/gridComponents/Chart/Chart.jsx 
b/superset-frontend/src/dashboard/components/gridComponents/Chart/Chart.jsx
index 9a429f5d223..47f0ad38b28 100644
--- a/superset-frontend/src/dashboard/components/gridComponents/Chart/Chart.jsx
+++ b/superset-frontend/src/dashboard/components/gridComponents/Chart/Chart.jsx
@@ -21,7 +21,7 @@ import { useCallback, useEffect, useRef, useMemo, useState, 
memo } from 'react';
 import PropTypes from 'prop-types';
 import { logging } from '@apache-superset/core';
 import { styled, t } from '@apache-superset/core/ui';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { useHistory } from 'react-router-dom';
 import { bindActionCreators } from 'redux';
 import { useDispatch, useSelector } from 'react-redux';
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts
 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts
index 3e556e535ee..9a0e22c99d8 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/FilterControls/utils.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { Dispatch } from 'react';
 import {
   setFocusedNativeFilter,
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
index f6ea8e8883d..e93c351ad5b 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FilterBar/Vertical.tsx
@@ -18,7 +18,7 @@
  */
 
 /* eslint-disable no-param-reassign */
-import { throttle } from 'lodash';
+import { throttle } from 'es-toolkit';
 import {
   memo,
   useEffect,
diff --git 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
index 452e93c47f5..f7ccc14c093 100644
--- 
a/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
+++ 
b/superset-frontend/src/dashboard/components/nativeFilters/FiltersConfigModal/FiltersConfigForm/utils.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { flatMapDeep } from 'lodash';
+import { flatMapDeep } from 'es-toolkit/compat';
 import type { FormInstance } from '@superset-ui/core/components';
 import { useState, useCallback } from 'react';
 import { CustomControlItem, Dataset } from '@superset-ui/chart-controls';
diff --git 
a/superset-frontend/src/explore/components/DataTableControl/index.tsx 
b/superset-frontend/src/explore/components/DataTableControl/index.tsx
index 7f010de6176..741a2995615 100644
--- a/superset-frontend/src/explore/components/DataTableControl/index.tsx
+++ b/superset-frontend/src/explore/components/DataTableControl/index.tsx
@@ -22,7 +22,7 @@ import { getTimeFormatter, safeHtmlSpan, TimeFormats } from 
'@superset-ui/core';
 import { css, styled, useTheme } from '@apache-superset/core/ui';
 import { GenericDataType } from '@apache-superset/core/api/core';
 import { Column } from 'react-table';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import {
   Constants,
   Button,
diff --git 
a/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx
 
b/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx
index 06777530c72..da01d55bbbe 100644
--- 
a/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx
+++ 
b/superset-frontend/src/explore/components/controls/ColorSchemeControl/index.tsx
@@ -27,7 +27,7 @@ import {
   CategoricalColorNamespace,
 } from '@superset-ui/core';
 import { css, useTheme } from '@apache-superset/core/ui';
-import { sortBy } from 'lodash';
+import { sortBy } from 'es-toolkit/compat';
 import ControlHeader from 'src/explore/components/ControlHeader';
 import {
   Tooltip,
diff --git 
a/superset-frontend/src/explore/components/controls/ColumnConfigControl/ControlForm/index.tsx
 
b/superset-frontend/src/explore/components/controls/ColumnConfigControl/ControlForm/index.tsx
index f8d60b375c7..16a3384aaf3 100644
--- 
a/superset-frontend/src/explore/components/controls/ColumnConfigControl/ControlForm/index.tsx
+++ 
b/superset-frontend/src/explore/components/controls/ColumnConfigControl/ControlForm/index.tsx
@@ -25,7 +25,7 @@ import {
 import { JsonObject, JsonValue } from '@superset-ui/core';
 import { useTheme } from '@apache-superset/core/ui';
 import { Constants } from '@superset-ui/core/components';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { ControlFormItemNode } from './ControlFormItem';
 
 export * from './ControlFormItem';
diff --git 
a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnMetricSelect.tsx
 
b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnMetricSelect.tsx
index b7b8bd3d67a..b4dce8736e5 100644
--- 
a/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnMetricSelect.tsx
+++ 
b/superset-frontend/src/explore/components/controls/DndColumnSelectControl/DndColumnMetricSelect.tsx
@@ -29,7 +29,6 @@ import {
 } from '@superset-ui/core';
 import { tn } from '@apache-superset/core';
 import { ColumnMeta, isColumnMeta } from '@superset-ui/chart-controls';
-import { isString } from 'lodash';
 import DndSelectLabel from 
'src/explore/components/controls/DndColumnSelectControl/DndSelectLabel';
 import OptionWrapper from 
'src/explore/components/controls/DndColumnSelectControl/OptionWrapper';
 import { DatasourcePanelDndItem } from 
'src/explore/components/DatasourcePanel/types';
@@ -148,7 +147,7 @@ function DndColumnMetricSelect(props: 
DndColumnMetricSelectProps) {
       }
 
       return selectedMetrics.some(metric => {
-        if (isString(metric)) {
+        if (typeof metric === 'string') {
           return metric === metricName;
         }
         if (metric instanceof AdhocMetric) {
@@ -171,11 +170,14 @@ function DndColumnMetricSelect(props: 
DndColumnMetricSelectProps) {
 
     const valueArray = ensureIsArray(value);
     return valueArray.map(item => {
-      if (isString(item) && combinedOptionsMap[item]) {
+      if (typeof item === 'string' && combinedOptionsMap[item]) {
         return item;
       }
 
-      if (isString(item) && savedMetrics.some(m => m.metric_name === item)) {
+      if (
+        typeof item === 'string' &&
+        savedMetrics.some(m => m.metric_name === item)
+      ) {
         return item;
       }
 
@@ -268,7 +270,7 @@ function DndColumnMetricSelect(props: 
DndColumnMetricSelectProps) {
   );
 
   const isColumnValue = (val: unknown): val is string =>
-    isString(val) && !!combinedOptionsMap[val];
+    typeof val === 'string' && !!combinedOptionsMap[val];
 
   const valuesRenderer = useCallback(
     () =>
diff --git 
a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/useAdvancedDataTypes.ts
 
b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/useAdvancedDataTypes.ts
index 44b2a4f5185..5837955be48 100644
--- 
a/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/useAdvancedDataTypes.ts
+++ 
b/superset-frontend/src/explore/components/controls/FilterControl/AdhocFilterEditPopoverSimpleTabContent/useAdvancedDataTypes.ts
@@ -19,7 +19,7 @@
 import { useCallback, useState } from 'react';
 import { t } from '@apache-superset/core';
 import { ensureIsArray, SupersetClient } from '@superset-ui/core';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import rison from 'rison';
 import { AdvancedDataTypesState, Props } from './index';
 
diff --git 
a/superset-frontend/src/explore/components/controls/TextAreaControl.tsx 
b/superset-frontend/src/explore/components/controls/TextAreaControl.tsx
index b28f3f0e98f..9ff0f9a9b30 100644
--- a/superset-frontend/src/explore/components/controls/TextAreaControl.tsx
+++ b/superset-frontend/src/explore/components/controls/TextAreaControl.tsx
@@ -18,7 +18,7 @@
  */
 import { Component } from 'react';
 import PropTypes from 'prop-types';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import {
   Input,
   Tooltip,
diff --git 
a/superset-frontend/src/explore/components/controls/TextControl/index.tsx 
b/superset-frontend/src/explore/components/controls/TextControl/index.tsx
index 805d3d90eb7..6713a0092bc 100644
--- a/superset-frontend/src/explore/components/controls/TextControl/index.tsx
+++ b/superset-frontend/src/explore/components/controls/TextControl/index.tsx
@@ -18,7 +18,7 @@
  */
 import { Component, ChangeEvent } from 'react';
 import { legacyValidateNumber, legacyValidateInteger } from 
'@superset-ui/core';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import ControlHeader from 'src/explore/components/ControlHeader';
 import { Constants, Input } from '@superset-ui/core/components';
 
diff --git 
a/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts
 
b/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts
index bfc53dc6d82..96d94c5b829 100644
--- 
a/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts
+++ 
b/superset-frontend/src/explore/controlUtils/getControlValuesCompatibleWithDatasource.ts
@@ -27,7 +27,7 @@ import {
   JsonValue,
   SimpleAdhocFilter,
 } from '@superset-ui/core';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import AdhocMetric from 
'src/explore/components/controls/MetricControl/AdhocMetric';
 
 const isControlValueCompatibleWithDatasource = (
diff --git a/superset-frontend/src/features/home/SubMenu.tsx 
b/superset-frontend/src/features/home/SubMenu.tsx
index 107700a2539..2699865d08a 100644
--- a/superset-frontend/src/features/home/SubMenu.tsx
+++ b/superset-frontend/src/features/home/SubMenu.tsx
@@ -22,7 +22,7 @@ import { Link, useHistory } from 'react-router-dom';
 import { t } from '@apache-superset/core';
 import { styled, SupersetTheme, css, useTheme } from 
'@apache-superset/core/ui';
 import cx from 'classnames';
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 import { Menu, MenuMode, MainNav } from '@superset-ui/core/components/Menu';
 import {
   Button,
diff --git a/superset-frontend/src/features/reports/ReportModal/actions.js 
b/superset-frontend/src/features/reports/ReportModal/actions.js
index eea5bf6621c..a86930c715a 100644
--- a/superset-frontend/src/features/reports/ReportModal/actions.js
+++ b/superset-frontend/src/features/reports/ReportModal/actions.js
@@ -24,7 +24,7 @@ import {
   addDangerToast,
   addSuccessToast,
 } from 'src/components/MessageToasts/actions';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 
 export const SET_REPORT = 'SET_REPORT';
 export function setReport(report, resourceId, creationMethod, filterField) {
diff --git 
a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx 
b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx
index 2ed450e8f63..18b01a35af2 100644
--- a/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx
+++ b/superset-frontend/src/filters/components/Range/RangeFilterPlugin.tsx
@@ -28,7 +28,6 @@ import { styled, useTheme, css } from 
'@apache-superset/core/ui';
 import { useCallback, useEffect, useMemo, useState, useRef } from 'react';
 import { FilterBarOrientation } from 'src/dashboard/types';
 // import Metadata from '@superset-ui/core/components/Metadata';
-import { isNumber } from 'lodash';
 import { InputNumber } from '@superset-ui/core/components/Input';
 import Slider from '@superset-ui/core/components/Slider';
 import { FormItem, Tooltip, Icons } from '@superset-ui/core/components';
@@ -165,11 +164,11 @@ const validateRange = (
       enableSingleValue === SingleValueType.Exact;
     const value = isSingleMin ? inputMin : inputMax;
 
-    if (!isNumber(value)) {
+    if (typeof value !== 'number') {
       return { isValid: false, errorMessage: requiredError };
     }
 
-    if (isNumber(value) && (value < min || value > max)) {
+    if (typeof value === 'number' && (value < min || value > max)) {
       return { isValid: false, errorMessage: rangeError };
     }
 
diff --git 
a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx 
b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
index d70fd7c90fe..7a1456905cc 100644
--- a/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
+++ b/superset-frontend/src/filters/components/Select/SelectFilterPlugin.tsx
@@ -31,7 +31,7 @@ import {
 import { tn } from '@apache-superset/core';
 import { styled } from '@apache-superset/core/ui';
 import { GenericDataType } from '@apache-superset/core/api/core';
-import { debounce, isUndefined } from 'lodash';
+import { debounce } from 'lodash';
 import { useImmerReducer } from 'use-immer';
 import {
   FormItem,
@@ -166,7 +166,7 @@ export default function PluginFilterSelect(props: 
PluginFilterSelectProps) {
     [data, col],
   );
   const [excludeFilterValues, setExcludeFilterValues] = useState(
-    isUndefined(filterState?.excludeFilterValues)
+    filterState?.excludeFilterValues === undefined
       ? true
       : filterState?.excludeFilterValues,
   );
diff --git a/superset-frontend/src/types/bootstrapTypes.ts 
b/superset-frontend/src/types/bootstrapTypes.ts
index 44de2bd84ae..55a62af0177 100644
--- a/superset-frontend/src/types/bootstrapTypes.ts
+++ b/superset-frontend/src/types/bootstrapTypes.ts
@@ -18,7 +18,7 @@
  */
 import { FormatLocaleDefinition } from 'd3-format';
 import { TimeLocaleDefinition } from 'd3-time-format';
-import { isPlainObject } from 'lodash';
+import { isPlainObject } from 'es-toolkit';
 import { Languages } from 'src/features/home/LanguagePicker';
 import type {
   AnyThemeConfig,
diff --git a/superset-frontend/src/utils/DebouncedMessageQueue.ts 
b/superset-frontend/src/utils/DebouncedMessageQueue.ts
index 99b50650aee..c4eb66d9186 100644
--- a/superset-frontend/src/utils/DebouncedMessageQueue.ts
+++ b/superset-frontend/src/utils/DebouncedMessageQueue.ts
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { debounce } from 'lodash';
+import { debounce } from 'es-toolkit';
 
 export interface DebouncedMessageQueueOptions<T> {
   callback?: (events: T[]) => void;
diff --git a/superset-frontend/src/utils/downloadAsImage.tsx 
b/superset-frontend/src/utils/downloadAsImage.tsx
index e525b8c3d67..fa493dda41b 100644
--- a/superset-frontend/src/utils/downloadAsImage.tsx
+++ b/superset-frontend/src/utils/downloadAsImage.tsx
@@ -18,7 +18,7 @@
  */
 import { SyntheticEvent } from 'react';
 import domToImage from 'dom-to-image-more';
-import { kebabCase } from 'lodash';
+import { kebabCase } from 'es-toolkit';
 // eslint-disable-next-line no-restricted-imports
 import { t } from '@apache-superset/core';
 import { SupersetTheme } from '@apache-superset/core/ui';
diff --git a/superset-frontend/src/utils/downloadAsPdf.ts 
b/superset-frontend/src/utils/downloadAsPdf.ts
index b6560071982..f9dc4d4c38c 100644
--- a/superset-frontend/src/utils/downloadAsPdf.ts
+++ b/superset-frontend/src/utils/downloadAsPdf.ts
@@ -18,7 +18,7 @@
  */
 import { SyntheticEvent } from 'react';
 import domToPdf from 'dom-to-pdf';
-import { kebabCase } from 'lodash';
+import { kebabCase } from 'es-toolkit';
 import { t } from '@apache-superset/core';
 import { logging } from '@apache-superset/core';
 import { addWarningToast } from 'src/components/MessageToasts/actions';
diff --git a/superset-frontend/src/utils/urlUtils.ts 
b/superset-frontend/src/utils/urlUtils.ts
index 6c3a51a987a..15a416ebc47 100644
--- a/superset-frontend/src/utils/urlUtils.ts
+++ b/superset-frontend/src/utils/urlUtils.ts
@@ -24,7 +24,7 @@ import {
 } from '@superset-ui/core';
 import Switchboard from '@superset-ui/switchboard';
 import rison from 'rison';
-import { isEmpty } from 'lodash';
+import { isEmpty } from 'es-toolkit/compat';
 import {
   RESERVED_CHART_URL_PARAMS,
   RESERVED_DASHBOARD_URL_PARAMS,
diff --git a/superset-websocket/package-lock.json 
b/superset-websocket/package-lock.json
index 723aa0c4ee8..ed85230b935 100644
--- a/superset-websocket/package-lock.json
+++ b/superset-websocket/package-lock.json
@@ -10,10 +10,10 @@
       "license": "Apache-2.0",
       "dependencies": {
         "cookie": "^1.1.1",
+        "es-toolkit": "^1.44.0",
         "hot-shots": "^13.1.0",
         "ioredis": "^5.9.2",
         "jsonwebtoken": "^9.0.3",
-        "lodash": "^4.17.23",
         "uuid": "^11.1.0",
         "winston": "^3.19.0",
         "ws": "^8.19.0"
@@ -24,7 +24,6 @@
         "@types/ioredis": "^5.0.0",
         "@types/jest": "^29.5.14",
         "@types/jsonwebtoken": "^9.0.10",
-        "@types/lodash": "^4.17.23",
         "@types/node": "^25.0.10",
         "@types/uuid": "^10.0.0",
         "@types/ws": "^8.18.1",
@@ -1808,13 +1807,6 @@
         "@types/node": "*"
       }
     },
-    "node_modules/@types/lodash": {
-      "version": "4.17.23",
-      "resolved": 
"https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz";,
-      "integrity": 
"sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@types/ms": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz";,
@@ -2792,6 +2784,16 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "node_modules/es-toolkit": {
+      "version": "1.44.0",
+      "resolved": 
"https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz";,
+      "integrity": 
"sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg==",
+      "license": "MIT",
+      "workspaces": [
+        "docs",
+        "benchmarks"
+      ]
+    },
     "node_modules/escalade": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz";,
@@ -5116,6 +5118,7 @@
       "version": "4.17.23",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz";,
       "integrity": 
"sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/lodash.defaults": {
@@ -7931,12 +7934,6 @@
         "@types/node": "*"
       }
     },
-    "@types/lodash": {
-      "version": "4.17.23",
-      "resolved": 
"https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz";,
-      "integrity": 
"sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==",
-      "dev": true
-    },
     "@types/ms": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz";,
@@ -8615,6 +8612,11 @@
         "is-arrayish": "^0.2.1"
       }
     },
+    "es-toolkit": {
+      "version": "1.44.0",
+      "resolved": 
"https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.44.0.tgz";,
+      "integrity": 
"sha512-6penXeZalaV88MM3cGkFZZfOoLGWshWWfdy0tWw/RlVVyhvMaWSBTOvXNeiW3e5FwdS5ePW0LGEu17zT139ktg=="
+    },
     "escalade": {
       "version": "3.1.2",
       "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz";,
@@ -10355,7 +10357,8 @@
     "lodash": {
       "version": "4.17.23",
       "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz";,
-      "integrity": 
"sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w=="
+      "integrity": 
"sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==",
+      "dev": true
     },
     "lodash.defaults": {
       "version": "4.2.0",
diff --git a/superset-websocket/package.json b/superset-websocket/package.json
index f3c35396813..cac8a7facf2 100644
--- a/superset-websocket/package.json
+++ b/superset-websocket/package.json
@@ -21,7 +21,7 @@
     "hot-shots": "^13.1.0",
     "ioredis": "^5.9.2",
     "jsonwebtoken": "^9.0.3",
-    "lodash": "^4.17.23",
+    "es-toolkit": "^1.44.0",
     "uuid": "^11.1.0",
     "winston": "^3.19.0",
     "ws": "^8.19.0"
@@ -32,7 +32,6 @@
     "@types/ioredis": "^5.0.0",
     "@types/jest": "^29.5.14",
     "@types/jsonwebtoken": "^9.0.10",
-    "@types/lodash": "^4.17.23",
     "@types/node": "^25.0.10",
     "@types/uuid": "^10.0.0",
     "@types/ws": "^8.18.1",
diff --git a/superset-websocket/src/config.ts b/superset-websocket/src/config.ts
index c739ad2beaa..0aeff677e9c 100644
--- a/superset-websocket/src/config.ts
+++ b/superset-websocket/src/config.ts
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-import { merge as _merge } from 'lodash';
+import { merge as _merge } from 'es-toolkit';
 
 export interface RedisConfig {
   port: number;

Reply via email to