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

bbovenzi pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new f5fd3bc4c8f Add eslint-no-duplicate-imports (#67201)
f5fd3bc4c8f is described below

commit f5fd3bc4c8fa0d0f4c1cbbd8d265be808c7c7912
Author: Brent Bovenzi <[email protected]>
AuthorDate: Tue May 19 15:30:41 2026 -0400

    Add eslint-no-duplicate-imports (#67201)
---
 airflow-core/src/airflow/ui/pnpm-lock.yaml         | 28 ++++++++++++++++------
 airflow-core/src/airflow/ui/rules/core.js          | 18 ++++++++++++++
 .../ui/src/components/AdvancedSearchToggle.tsx     |  3 +--
 .../ui/src/components/Assets/AssetEvents.tsx       | 13 +++++++---
 .../ui/src/components/AttrSelectFilterMulti.tsx    |  4 ++--
 .../ui/src/components/DataTable/DataTable.tsx      |  3 +--
 .../src/components/DataTable/FilterMenuButton.tsx  |  3 +--
 .../src/components/DataTable/useTableUrlState.ts   |  3 +--
 .../ui/src/components/DisplayMarkdownButton.tsx    |  3 +--
 .../ui/src/components/EditableMarkdownButton.tsx   |  3 +--
 .../ui/src/components/Graph/DownloadButton.tsx     |  3 +--
 .../airflow/ui/src/components/GraphTaskFilters.tsx |  3 +--
 .../src/components/MarkAs/Run/MarkRunAsButton.tsx  |  3 +--
 .../MarkAs/TaskGroup/MarkTaskGroupAsButton.tsx     |  3 +--
 .../TaskInstance/MarkTaskInstanceAsButton.tsx      |  3 +--
 .../airflow/ui/src/components/ReactMarkdown.tsx    |  2 +-
 .../src/airflow/ui/src/components/RunTypeIcon.tsx  |  3 +--
 .../src/components/TriggerDag/TriggerDAGButton.tsx |  4 +---
 .../ui/src/layouts/Details/DetailsLayout.tsx       |  4 +---
 .../ui/src/layouts/Details/PanelButtons.tsx        |  3 +--
 .../ui/src/layouts/Details/TaskStreamFilter.tsx    |  3 +--
 airflow-core/src/airflow/ui/src/main.tsx           |  3 +--
 .../src/airflow/ui/src/pages/Asset/AssetLayout.tsx |  3 +--
 .../src/airflow/ui/src/pages/Dag/Code/Code.tsx     |  3 +--
 .../airflow/ui/src/pages/Pools/EditPoolButton.tsx  |  3 +--
 .../ui/src/pages/TaskInstance/HITLResponse.tsx     |  3 +--
 .../src/pages/TaskInstance/Logs/TaskLogHeader.tsx  |  3 +--
 .../ManageVariable/DeleteVariableButton.tsx        |  3 +--
 .../ManageVariable/EditVariableButton.tsx          |  3 +--
 .../airflow/ui/src/pages/XCom/DeleteXComButton.tsx |  6 ++---
 .../src/airflow/ui/src/queries/useDeleteDag.ts     |  3 +--
 31 files changed, 79 insertions(+), 69 deletions(-)

diff --git a/airflow-core/src/airflow/ui/pnpm-lock.yaml 
b/airflow-core/src/airflow/ui/pnpm-lock.yaml
index deacc4a6867..bc1dab32411 100644
--- a/airflow-core/src/airflow/ui/pnpm-lock.yaml
+++ b/airflow-core/src/airflow/ui/pnpm-lock.yaml
@@ -962,36 +962,42 @@ packages:
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@rolldown/[email protected]':
     resolution: {integrity: 
sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@rolldown/[email protected]':
     resolution: {integrity: 
sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [ppc64]
     os: [linux]
+    libc: [glibc]
 
   '@rolldown/[email protected]':
     resolution: {integrity: 
sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [s390x]
     os: [linux]
+    libc: [glibc]
 
   '@rolldown/[email protected]':
     resolution: {integrity: 
sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@rolldown/[email protected]':
     resolution: {integrity: 
sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==}
     engines: {node: ^20.19.0 || >=22.12.0}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@rolldown/[email protected]':
     resolution: {integrity: 
sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==}
@@ -1074,24 +1080,28 @@ packages:
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   '@swc/[email protected]':
     resolution: {integrity: 
sha512-0a+Lix+FSSHBSBOA0XznCcHo5/1nA6oLLjcnocvzXeqtdjnPb+SvchItHI+lfeiuj1sClYPDvPMLSLyXFaiIKw==}
     engines: {node: '>=10'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   '@swc/[email protected]':
     resolution: {integrity: 
sha512-wG9J8vReUlpaHz4KOD/5UE1AUgirimU4UFT9oZmupUDEofxJKYb1mTA/DrMj0s78bkBiNI+7Fo2EgPuvOJfuAA==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   '@swc/[email protected]':
     resolution: {integrity: 
sha512-4nwbVvCphKzicwNWRmvD5iBaZj8JYsRGa4xOxJmOyHlMDpsvvJ2OR2cODlvWyGFH6BYL1MfIAK3qph3hp0Az6g==}
     engines: {node: '>=10'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   '@swc/[email protected]':
     resolution: {integrity: 
sha512-zk0RYO+LjiBCat2RTMHzAWaMky0cra9loH4oRrLKLLNuL+jarxKLFDA8xTZWEkCPLjUTwlRN7d28eDLLMgtUcQ==}
@@ -3045,24 +3055,28 @@ packages:
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [glibc]
 
   [email protected]:
     resolution: {integrity: 
sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
     engines: {node: '>= 12.0.0'}
     cpu: [arm64]
     os: [linux]
+    libc: [musl]
 
   [email protected]:
     resolution: {integrity: 
sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [glibc]
 
   [email protected]:
     resolution: {integrity: 
sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
     engines: {node: '>= 12.0.0'}
     cpu: [x64]
     os: [linux]
+    libc: [musl]
 
   [email protected]:
     resolution: {integrity: 
sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
@@ -6777,7 +6791,7 @@ snapshots:
       has-property-descriptors: 1.0.2
       has-proto: 1.2.0
       has-symbols: 1.1.0
-      hasown: 2.0.2
+      hasown: 2.0.3
       internal-slot: 1.1.0
       is-array-buffer: 3.0.5
       is-callable: 1.2.7
@@ -6845,7 +6859,7 @@ snapshots:
 
   [email protected]:
     dependencies:
-      hasown: 2.0.2
+      hasown: 2.0.3
 
   [email protected]:
     dependencies:
@@ -7203,7 +7217,7 @@ snapshots:
       get-proto: 1.0.1
       gopd: 1.2.0
       has-symbols: 1.1.0
-      hasown: 2.0.2
+      hasown: 2.0.3
       math-intrinsics: 1.1.0
 
   [email protected]:
@@ -7409,7 +7423,7 @@ snapshots:
   [email protected]:
     dependencies:
       es-errors: 1.3.0
-      hasown: 2.0.2
+      hasown: 2.0.3
       side-channel: 1.1.0
 
   [email protected]: {}
@@ -7465,7 +7479,7 @@ snapshots:
 
   [email protected]:
     dependencies:
-      hasown: 2.0.2
+      hasown: 2.0.3
 
   [email protected]:
     dependencies:
@@ -7523,7 +7537,7 @@ snapshots:
       call-bound: 1.0.4
       gopd: 1.2.0
       has-tostringtag: 1.0.2
-      hasown: 2.0.2
+      hasown: 2.0.3
 
   [email protected]: {}
 
@@ -7759,7 +7773,7 @@ snapshots:
 
   [email protected]:
     dependencies:
-      semver: 7.7.4
+      semver: 7.8.0
 
   [email protected]: {}
 
diff --git a/airflow-core/src/airflow/ui/rules/core.js 
b/airflow-core/src/airflow/ui/rules/core.js
index 55ee1533251..48fcce1f39a 100644
--- a/airflow-core/src/airflow/ui/rules/core.js
+++ b/airflow-core/src/airflow/ui/rules/core.js
@@ -427,6 +427,24 @@ export const coreRules = /** @type {const} @satisfies 
{FlatConfig.Config} */ ({
      */
     "no-duplicate-case": ERROR,
 
+    /**
+     * Disallow duplicate value imports from the same module.
+     * Separate `import type` statements are allowed.
+     *
+     * @example
+     * ```typescript
+     * // ❌ Incorrect
+     * import { Foo } from "src/components/ui";
+     * import { Bar } from "src/components/ui";
+     *
+     * // ✅ Correct
+     * import { Foo, Bar } from "src/components/ui";
+     * import type { Baz } from "src/components/ui";
+     * ```
+     * @see 
[no-duplicate-imports](https://eslint.org/docs/latest/rules/no-duplicate-imports)
+     */
+    "no-duplicate-imports": [ERROR, { allowSeparateTypeImports: true }],
+
     /**
      * Disallow empty block statements.
      *
diff --git 
a/airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx 
b/airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx
index b72a13bba83..3a3053c319a 100644
--- a/airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx
+++ b/airflow-core/src/airflow/ui/src/components/AdvancedSearchToggle.tsx
@@ -20,8 +20,7 @@ import { Box, Stack, Text } from "@chakra-ui/react";
 import { useTranslation } from "react-i18next";
 import { LuRegex } from "react-icons/lu";
 
-import { IconButton } from "src/components/ui";
-import { Tooltip } from "src/components/ui";
+import { IconButton, Tooltip } from "src/components/ui";
 
 export type AdvancedSearchToggleProps = {
   readonly enabled: boolean;
diff --git a/airflow-core/src/airflow/ui/src/components/Assets/AssetEvents.tsx 
b/airflow-core/src/airflow/ui/src/components/Assets/AssetEvents.tsx
index 18156d70811..f0f1e6173ad 100644
--- a/airflow-core/src/airflow/ui/src/components/Assets/AssetEvents.tsx
+++ b/airflow-core/src/airflow/ui/src/components/Assets/AssetEvents.tsx
@@ -16,9 +16,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { Box, Heading, Flex, HStack, Skeleton, Separator } from 
"@chakra-ui/react";
-import type { BoxProps } from "@chakra-ui/react";
-import { createListCollection } from "@chakra-ui/react/collection";
+import {
+  Box,
+  Heading,
+  Flex,
+  HStack,
+  Skeleton,
+  Separator,
+  type BoxProps,
+  createListCollection,
+} from "@chakra-ui/react";
 import { useTranslation } from "react-i18next";
 import { FiDatabase } from "react-icons/fi";
 
diff --git 
a/airflow-core/src/airflow/ui/src/components/AttrSelectFilterMulti.tsx 
b/airflow-core/src/airflow/ui/src/components/AttrSelectFilterMulti.tsx
index 99dab0b918b..9b45c314330 100644
--- a/airflow-core/src/airflow/ui/src/components/AttrSelectFilterMulti.tsx
+++ b/airflow-core/src/airflow/ui/src/components/AttrSelectFilterMulti.tsx
@@ -16,8 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { type CollectionItem, createListCollection } from "@chakra-ui/react";
-import type { SelectValueChangeDetails } from "@chakra-ui/react";
+import { createListCollection } from "@chakra-ui/react";
+import type { SelectValueChangeDetails, CollectionItem } from 
"@chakra-ui/react";
 
 import { Select } from "src/components/ui";
 
diff --git a/airflow-core/src/airflow/ui/src/components/DataTable/DataTable.tsx 
b/airflow-core/src/airflow/ui/src/components/DataTable/DataTable.tsx
index 19b058aaecd..9adc95b6490 100644
--- a/airflow-core/src/airflow/ui/src/components/DataTable/DataTable.tsx
+++ b/airflow-core/src/airflow/ui/src/components/DataTable/DataTable.tsx
@@ -39,8 +39,7 @@ import { TableList } from 
"src/components/DataTable/TableList";
 import { ToggleTableDisplay } from 
"src/components/DataTable/ToggleTableDisplay";
 import { createSkeletonMock } from "src/components/DataTable/skeleton";
 import type { CardDef, MetaColumn, TableState } from 
"src/components/DataTable/types";
-import { IconButton } from "src/components/ui";
-import { ProgressBar, Pagination, Toaster } from "src/components/ui";
+import { IconButton, ProgressBar, Pagination, Toaster } from 
"src/components/ui";
 
 type DataTableProps<TData> = {
   readonly allowFiltering?: boolean;
diff --git 
a/airflow-core/src/airflow/ui/src/components/DataTable/FilterMenuButton.tsx 
b/airflow-core/src/airflow/ui/src/components/DataTable/FilterMenuButton.tsx
index a378cdf9f27..bee7b9f8be4 100644
--- a/airflow-core/src/airflow/ui/src/components/DataTable/FilterMenuButton.tsx
+++ b/airflow-core/src/airflow/ui/src/components/DataTable/FilterMenuButton.tsx
@@ -20,8 +20,7 @@ import { flexRender, type Header, type Table } from 
"@tanstack/react-table";
 import { useTranslation } from "react-i18next";
 import { LuColumns3 } from "react-icons/lu";
 
-import { IconButton } from "src/components/ui";
-import { Menu } from "src/components/ui";
+import { Menu, IconButton } from "src/components/ui";
 import { Checkbox } from "src/components/ui/Checkbox";
 
 type Props<TData> = {
diff --git 
a/airflow-core/src/airflow/ui/src/components/DataTable/useTableUrlState.ts 
b/airflow-core/src/airflow/ui/src/components/DataTable/useTableUrlState.ts
index a968a0c4cb4..da4889b833a 100644
--- a/airflow-core/src/airflow/ui/src/components/DataTable/useTableUrlState.ts
+++ b/airflow-core/src/airflow/ui/src/components/DataTable/useTableUrlState.ts
@@ -16,8 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import { useSearchParams } from "react-router-dom";
-import { useLocation } from "react-router-dom";
+import { useSearchParams, useLocation } from "react-router-dom";
 import { useLocalStorage } from "usehooks-ts";
 
 import { tableSortKey } from "src/constants/localStorage";
diff --git 
a/airflow-core/src/airflow/ui/src/components/DisplayMarkdownButton.tsx 
b/airflow-core/src/airflow/ui/src/components/DisplayMarkdownButton.tsx
index 422a7503482..0724adfa351 100644
--- a/airflow-core/src/airflow/ui/src/components/DisplayMarkdownButton.tsx
+++ b/airflow-core/src/airflow/ui/src/components/DisplayMarkdownButton.tsx
@@ -19,8 +19,7 @@
 import { Box, Heading, VStack } from "@chakra-ui/react";
 import { type ReactElement, useState } from "react";
 
-import { IconButton } from "src/components/ui";
-import { Dialog } from "src/components/ui";
+import { IconButton, Dialog } from "src/components/ui";
 import { ResizableWrapper, MARKDOWN_DIALOG_STORAGE_KEY } from 
"src/components/ui/ResizableWrapper";
 
 import ReactMarkdown from "./ReactMarkdown";
diff --git 
a/airflow-core/src/airflow/ui/src/components/EditableMarkdownButton.tsx 
b/airflow-core/src/airflow/ui/src/components/EditableMarkdownButton.tsx
index 4cd85e1d38b..7d2f5e61c8e 100644
--- a/airflow-core/src/airflow/ui/src/components/EditableMarkdownButton.tsx
+++ b/airflow-core/src/airflow/ui/src/components/EditableMarkdownButton.tsx
@@ -21,8 +21,7 @@ import { useState } from "react";
 import { useTranslation } from "react-i18next";
 import { PiNoteBold, PiNoteBlankBold } from "react-icons/pi";
 
-import { IconButton } from "src/components/ui";
-import { Dialog } from "src/components/ui";
+import { IconButton, Dialog } from "src/components/ui";
 import { ResizableWrapper, MARKDOWN_DIALOG_STORAGE_KEY } from 
"src/components/ui/ResizableWrapper";
 
 import EditableMarkdownArea from "./EditableMarkdownArea";
diff --git 
a/airflow-core/src/airflow/ui/src/components/Graph/DownloadButton.tsx 
b/airflow-core/src/airflow/ui/src/components/Graph/DownloadButton.tsx
index f67e990c765..327c63306b8 100644
--- a/airflow-core/src/airflow/ui/src/components/Graph/DownloadButton.tsx
+++ b/airflow-core/src/airflow/ui/src/components/Graph/DownloadButton.tsx
@@ -21,8 +21,7 @@ import { toPng } from "html-to-image";
 import { useTranslation } from "react-i18next";
 import { FiDownload } from "react-icons/fi";
 
-import { IconButton } from "src/components/ui";
-import { toaster } from "src/components/ui";
+import { IconButton, toaster } from "src/components/ui";
 
 export const DownloadButton = ({ name }: { readonly name: string }) => {
   const { t: translate } = useTranslation("components");
diff --git a/airflow-core/src/airflow/ui/src/components/GraphTaskFilters.tsx 
b/airflow-core/src/airflow/ui/src/components/GraphTaskFilters.tsx
index 68db3a5218d..e6515458f48 100644
--- a/airflow-core/src/airflow/ui/src/components/GraphTaskFilters.tsx
+++ b/airflow-core/src/airflow/ui/src/components/GraphTaskFilters.tsx
@@ -33,8 +33,7 @@ import { useParams, useSearchParams } from "react-router-dom";
 import type { TaskInstanceState } from "openapi/requests/types.gen";
 import { AttrSelectFilterMulti } from "src/components/AttrSelectFilterMulti";
 import { StateBadge } from "src/components/StateBadge";
-import { IconButton } from "src/components/ui";
-import { Select } from "src/components/ui";
+import { IconButton, Select } from "src/components/ui";
 import { Menu } from "src/components/ui/Menu";
 import { NumberInputField, NumberInputRoot } from 
"src/components/ui/NumberInput";
 import { SearchParamsKeys } from "src/constants/searchParams";
diff --git 
a/airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx 
b/airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx
index e98c76872c0..975691c9657 100644
--- a/airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx
+++ b/airflow-core/src/airflow/ui/src/components/MarkAs/Run/MarkRunAsButton.tsx
@@ -25,8 +25,7 @@ import { LuCheck } from "react-icons/lu";
 
 import type { DAGRunPatchStates, DAGRunResponse } from 
"openapi/requests/types.gen";
 import { StateBadge } from "src/components/StateBadge";
-import { IconButton } from "src/components/ui";
-import { Menu, Tooltip } from "src/components/ui";
+import { IconButton, Menu, Tooltip } from "src/components/ui";
 
 import { allowedStates } from "../utils";
 import MarkRunAsDialog from "./MarkRunAsDialog";
diff --git 
a/airflow-core/src/airflow/ui/src/components/MarkAs/TaskGroup/MarkTaskGroupAsButton.tsx
 
b/airflow-core/src/airflow/ui/src/components/MarkAs/TaskGroup/MarkTaskGroupAsButton.tsx
index 0d40ac61a7d..1fd80b403ac 100644
--- 
a/airflow-core/src/airflow/ui/src/components/MarkAs/TaskGroup/MarkTaskGroupAsButton.tsx
+++ 
b/airflow-core/src/airflow/ui/src/components/MarkAs/TaskGroup/MarkTaskGroupAsButton.tsx
@@ -25,8 +25,7 @@ import { LuCheck } from "react-icons/lu";
 
 import type { LightGridTaskInstanceSummary, TaskInstanceState } from 
"openapi/requests/types.gen";
 import { StateBadge } from "src/components/StateBadge";
-import { IconButton } from "src/components/ui";
-import { Menu, Tooltip } from "src/components/ui";
+import { IconButton, Menu, Tooltip } from "src/components/ui";
 
 import { allowedStates } from "../utils";
 import MarkTaskGroupAsDialog from "./MarkTaskGroupAsDialog";
diff --git 
a/airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx
 
b/airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx
index c0b4d105059..a930938132d 100644
--- 
a/airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx
+++ 
b/airflow-core/src/airflow/ui/src/components/MarkAs/TaskInstance/MarkTaskInstanceAsButton.tsx
@@ -25,8 +25,7 @@ import { LuCheck } from "react-icons/lu";
 
 import type { TaskInstanceResponse, TaskInstanceState } from 
"openapi/requests/types.gen";
 import { StateBadge } from "src/components/StateBadge";
-import { IconButton } from "src/components/ui";
-import { Menu, Tooltip } from "src/components/ui";
+import { IconButton, Menu, Tooltip } from "src/components/ui";
 
 import { allowedStates } from "../utils";
 import MarkTaskInstanceAsDialog from "./MarkTaskInstanceAsDialog";
diff --git a/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx 
b/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
index cc14275265f..57a585a2b91 100644
--- a/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
+++ b/airflow-core/src/airflow/ui/src/components/ReactMarkdown.tsx
@@ -29,8 +29,8 @@ import {
   Text,
 } from "@chakra-ui/react";
 import type { PropsWithChildren, ReactNode } from "react";
-import type { Components, Options } from "react-markdown";
 import ReactMD from "react-markdown";
+import type { Components, Options } from "react-markdown";
 import remarkGfm from "remark-gfm";
 
 import { useColorMode } from "src/context/colorMode";
diff --git a/airflow-core/src/airflow/ui/src/components/RunTypeIcon.tsx 
b/airflow-core/src/airflow/ui/src/components/RunTypeIcon.tsx
index 9eef6066a0b..bec5289d1f0 100644
--- a/airflow-core/src/airflow/ui/src/components/RunTypeIcon.tsx
+++ b/airflow-core/src/airflow/ui/src/components/RunTypeIcon.tsx
@@ -17,8 +17,7 @@
  * under the License.
  */
 import type { IconBaseProps } from "react-icons";
-import { HiDatabase } from "react-icons/hi";
-import { HiLightningBolt } from "react-icons/hi";
+import { HiDatabase, HiLightningBolt } from "react-icons/hi";
 import { MdPlayArrow, MdOutlineSchedule } from "react-icons/md";
 import { RiArrowGoBackFill } from "react-icons/ri";
 
diff --git 
a/airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx 
b/airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx
index 303d6e5799e..7466bfc4a6a 100644
--- a/airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx
+++ b/airflow-core/src/airflow/ui/src/components/TriggerDag/TriggerDAGButton.tsx
@@ -24,9 +24,7 @@ import { FiPlay } from "react-icons/fi";
 import { useParams } from "react-router-dom";
 
 import { useDagRunServiceGetDagRun } from "openapi/queries";
-import { IconButton } from "src/components/ui";
-import { Menu } from "src/components/ui";
-import { Tooltip } from "src/components/ui";
+import { IconButton, Menu, Tooltip } from "src/components/ui";
 
 import TriggerDAGModal from "./TriggerDAGModal";
 
diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx 
b/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx
index 6bb9b5f1bad..97d184a4491 100644
--- a/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx
+++ b/airflow-core/src/airflow/ui/src/layouts/Details/DetailsLayout.tsx
@@ -42,9 +42,7 @@ import BackfillBanner from 
"src/components/Banner/BackfillBanner";
 import { DAGWarningsModal } from "src/components/DAGWarningsModal";
 import { SearchDagsButton } from "src/components/SearchDags";
 import { TriggerDAGButton } from "src/components/TriggerDag/TriggerDAGButton";
-import { IconButton } from "src/components/ui";
-import { ProgressBar } from "src/components/ui";
-import { Toaster } from "src/components/ui";
+import { IconButton, ProgressBar, Toaster } from "src/components/ui";
 import type { DagView } from "src/constants/dagView";
 import { DEFAULT_DAG_VIEW_KEY } from "src/constants/localStorage";
 import { SearchParamsKeys } from "src/constants/searchParams";
diff --git a/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx 
b/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx
index d0f1cc6a635..2d550c20941 100644
--- a/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx
+++ b/airflow-core/src/airflow/ui/src/layouts/Details/PanelButtons.tsx
@@ -41,8 +41,7 @@ import { useLocalStorage } from "usehooks-ts";
 import { DagVersionSelect } from "src/components/DagVersionSelect";
 import { DirectionDropdown } from "src/components/Graph/DirectionDropdown";
 import { GraphTaskFilters } from "src/components/GraphTaskFilters";
-import { IconButton } from "src/components/ui";
-import { Tooltip } from "src/components/ui";
+import { IconButton, Tooltip } from "src/components/ui";
 import { type ButtonGroupOption, ButtonGroupToggle } from 
"src/components/ui/ButtonGroupToggle";
 import type { DagView } from "src/constants/dagView";
 import { dependenciesKey } from "src/constants/localStorage";
diff --git 
a/airflow-core/src/airflow/ui/src/layouts/Details/TaskStreamFilter.tsx 
b/airflow-core/src/airflow/ui/src/layouts/Details/TaskStreamFilter.tsx
index 231edeb31cc..af8905950ed 100644
--- a/airflow-core/src/airflow/ui/src/layouts/Details/TaskStreamFilter.tsx
+++ b/airflow-core/src/airflow/ui/src/layouts/Details/TaskStreamFilter.tsx
@@ -22,8 +22,7 @@ import { useTranslation } from "react-i18next";
 import { FiFilter, FiInfo } from "react-icons/fi";
 import { useParams, useSearchParams } from "react-router-dom";
 
-import { IconButton } from "src/components/ui";
-import { Tooltip } from "src/components/ui";
+import { IconButton, Tooltip } from "src/components/ui";
 import { Menu } from "src/components/ui/Menu";
 
 export const TaskStreamFilter = () => {
diff --git a/airflow-core/src/airflow/ui/src/main.tsx 
b/airflow-core/src/airflow/ui/src/main.tsx
index 4daeb12b19e..ef24cb75b29 100644
--- a/airflow-core/src/airflow/ui/src/main.tsx
+++ b/airflow-core/src/airflow/ui/src/main.tsx
@@ -20,8 +20,7 @@ import * as ChakraUI from "@chakra-ui/react";
 import * as EmotionReact from "@emotion/react";
 import { QueryClientProvider } from "@tanstack/react-query";
 import axios, { type AxiosError } from "axios";
-import { StrictMode } from "react";
-import React from "react";
+import React, { StrictMode } from "react";
 import * as ReactDOM from "react-dom";
 import { createRoot } from "react-dom/client";
 import { I18nextProvider } from "react-i18next";
diff --git a/airflow-core/src/airflow/ui/src/pages/Asset/AssetLayout.tsx 
b/airflow-core/src/airflow/ui/src/pages/Asset/AssetLayout.tsx
index e44540d2b59..47a7edf6295 100644
--- a/airflow-core/src/airflow/ui/src/pages/Asset/AssetLayout.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Asset/AssetLayout.tsx
@@ -21,8 +21,7 @@ import { useReactFlow } from "@xyflow/react";
 import { useState } from "react";
 import { useTranslation } from "react-i18next";
 import { PanelGroup, Panel, PanelResizeHandle } from "react-resizable-panels";
-import { useParams } from "react-router-dom";
-import { useSearchParams } from "react-router-dom";
+import { useParams, useSearchParams } from "react-router-dom";
 
 import { useAssetServiceGetAsset, useAssetServiceGetAssetEvents } from 
"openapi/queries";
 import { AssetEvents } from "src/components/Assets/AssetEvents";
diff --git a/airflow-core/src/airflow/ui/src/pages/Dag/Code/Code.tsx 
b/airflow-core/src/airflow/ui/src/pages/Dag/Code/Code.tsx
index 0196f947ca9..8d6f3a3455e 100644
--- a/airflow-core/src/airflow/ui/src/pages/Dag/Code/Code.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Dag/Code/Code.tsx
@@ -34,8 +34,7 @@ import { DagVersionSelect } from 
"src/components/DagVersionSelect";
 import { ErrorAlert } from "src/components/ErrorAlert";
 import Editor, { type EditorProps } from "src/components/MonacoEditor";
 import Time from "src/components/Time";
-import { ClipboardRoot, ClipboardButton, Tooltip } from "src/components/ui";
-import { ProgressBar } from "src/components/ui";
+import { ClipboardRoot, ClipboardButton, Tooltip, ProgressBar } from 
"src/components/ui";
 import { useMonacoTheme } from "src/context/colorMode";
 import useSelectedVersion from "src/hooks/useSelectedVersion";
 import { useConfig } from "src/queries/useConfig";
diff --git a/airflow-core/src/airflow/ui/src/pages/Pools/EditPoolButton.tsx 
b/airflow-core/src/airflow/ui/src/pages/Pools/EditPoolButton.tsx
index e4893ffcc7a..6036f5714d6 100644
--- a/airflow-core/src/airflow/ui/src/pages/Pools/EditPoolButton.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/Pools/EditPoolButton.tsx
@@ -21,8 +21,7 @@ import { useTranslation } from "react-i18next";
 import { FiEdit } from "react-icons/fi";
 
 import type { PoolResponse } from "openapi/requests/types.gen";
-import { IconButton } from "src/components/ui";
-import { Dialog } from "src/components/ui";
+import { IconButton, Dialog } from "src/components/ui";
 import { useEditPool } from "src/queries/useEditPool";
 
 import PoolForm, { type PoolBody } from "./PoolForm";
diff --git 
a/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx 
b/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx
index 65bd1042a4f..aecd524db47 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/HITLResponse.tsx
@@ -17,8 +17,7 @@
  * under the License.
  */
 import { Box } from "@chakra-ui/react";
-import { useParams } from "react-router-dom";
-import { useSearchParams } from "react-router-dom";
+import { useParams, useSearchParams } from "react-router-dom";
 
 import {
   useTaskInstanceServiceGetHitlDetailTryDetail,
diff --git 
a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx 
b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx
index f3d70a3a4d0..8e50660314e 100644
--- a/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/TaskInstance/Logs/TaskLogHeader.tsx
@@ -32,8 +32,7 @@ import { useSearchParams } from "react-router-dom";
 
 import type { TaskInstanceResponse } from "openapi/requests/types.gen";
 import { TaskTrySelect } from "src/components/TaskTrySelect";
-import { IconButton } from "src/components/ui";
-import { Menu, Select } from "src/components/ui";
+import { IconButton, Menu, Select } from "src/components/ui";
 import { LazyClipboard } from "src/components/ui/LazyClipboard";
 import { SearchParamsKeys } from "src/constants/searchParams";
 import { defaultSystem } from "src/theme";
diff --git 
a/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx
 
b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx
index 487f7466b7d..eaa94a6ddb5 100644
--- 
a/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx
+++ 
b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/DeleteVariableButton.tsx
@@ -20,8 +20,7 @@ import { Button, Code, Flex, Heading, Text, useDisclosure, 
VStack } from "@chakr
 import { useTranslation } from "react-i18next";
 import { FiTrash2 } from "react-icons/fi";
 
-import { IconButton } from "src/components/ui";
-import { Dialog } from "src/components/ui";
+import { IconButton, Dialog } from "src/components/ui";
 import { useDeleteVariable } from "src/queries/useDeleteVariable";
 
 type Props = {
diff --git 
a/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx
 
b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx
index 12e258d3fb1..3ab1888c332 100644
--- 
a/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx
+++ 
b/airflow-core/src/airflow/ui/src/pages/Variables/ManageVariable/EditVariableButton.tsx
@@ -21,8 +21,7 @@ import { useTranslation } from "react-i18next";
 import { FiEdit } from "react-icons/fi";
 
 import type { VariableResponse } from "openapi/requests/types.gen";
-import { IconButton } from "src/components/ui";
-import { Dialog } from "src/components/ui";
+import { IconButton, Dialog } from "src/components/ui";
 import { useEditVariable } from "src/queries/useEditVariable";
 
 import type { VariableBody } from "./VariableForm";
diff --git a/airflow-core/src/airflow/ui/src/pages/XCom/DeleteXComButton.tsx 
b/airflow-core/src/airflow/ui/src/pages/XCom/DeleteXComButton.tsx
index 082d7d1b321..828125d24cc 100644
--- a/airflow-core/src/airflow/ui/src/pages/XCom/DeleteXComButton.tsx
+++ b/airflow-core/src/airflow/ui/src/pages/XCom/DeleteXComButton.tsx
@@ -23,11 +23,9 @@ import { FiTrash2 } from "react-icons/fi";
 
 import { useXcomServiceGetXcomEntriesKey } from "openapi/queries";
 import { XcomService } from "openapi/requests/services.gen";
-import type { XComResponse } from "openapi/requests/types.gen";
-import type { DeleteXcomEntryData } from "openapi/requests/types.gen";
+import type { XComResponse, DeleteXcomEntryData } from 
"openapi/requests/types.gen";
 import DeleteDialog from "src/components/DeleteDialog";
-import { IconButton } from "src/components/ui";
-import { toaster } from "src/components/ui";
+import { IconButton, toaster } from "src/components/ui";
 
 type DeleteXComButtonProps = {
   readonly xcom: XComResponse;
diff --git a/airflow-core/src/airflow/ui/src/queries/useDeleteDag.ts 
b/airflow-core/src/airflow/ui/src/queries/useDeleteDag.ts
index d5f4838df72..2c94ccef980 100644
--- a/airflow-core/src/airflow/ui/src/queries/useDeleteDag.ts
+++ b/airflow-core/src/airflow/ui/src/queries/useDeleteDag.ts
@@ -19,8 +19,7 @@
 import { useQueryClient } from "@tanstack/react-query";
 import { useTranslation } from "react-i18next";
 
-import { useDagServiceDeleteDag, useDagServiceGetDagsUiKey } from 
"openapi/queries";
-import { useDagServiceGetDagKey } from "openapi/queries";
+import { useDagServiceDeleteDag, useDagServiceGetDagsUiKey, 
useDagServiceGetDagKey } from "openapi/queries";
 import { toaster } from "src/components/ui";
 import { gridQueryKeys } from "src/queries/gridViewQueryKeys";
 import { createErrorToaster } from "src/utils";

Reply via email to