diff --git a/.eslintrc.js b/.eslintrc.js
index a7ec440e36..46ed530687 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -35,7 +35,6 @@ module.exports = {
'no-empty': 'off',
'no-func-assign': 'off',
'no-cond-assign': 'off',
- 'react/react-in-jsx-scope': 'off',
'@typescript-eslint/no-non-null-assertion': 'off',
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-empty-function': 'off',
diff --git a/apps/desktop/src/preload/components/enable-workspace-modal/index.tsx b/apps/desktop/src/preload/components/enable-workspace-modal/index.tsx
index 422290db49..ce058d3fc7 100644
--- a/apps/desktop/src/preload/components/enable-workspace-modal/index.tsx
+++ b/apps/desktop/src/preload/components/enable-workspace-modal/index.tsx
@@ -5,11 +5,11 @@ import { useTranslation } from '@affine/i18n';
import { CloseIcon } from '@blocksuite/icons';
import router from 'next/router';
import { useCallback, useState } from 'react';
+import React from 'react';
import { useGlobalState } from '@/store/app';
import { Content, ContentTitle, Header, StyleButton, StyleTips } from './style';
-
interface EnableWorkspaceModalProps {
open: boolean;
onClose: () => void;
diff --git a/apps/desktop/src/preload/components/icons/index.tsx b/apps/desktop/src/preload/components/icons/index.tsx
index 681d03616b..ed4267da18 100644
--- a/apps/desktop/src/preload/components/icons/index.tsx
+++ b/apps/desktop/src/preload/components/icons/index.tsx
@@ -5,7 +5,7 @@ import {
LocalWorkspaceIcon as DefaultLocalWorkspaceIcon,
PublishIcon as DefaultPublishIcon,
} from '@blocksuite/icons';
-
+import React from 'react';
// Here are some icons with special color or size
export const JoinedWorkspaceIcon = () => {
diff --git a/package.json b/package.json
index 206094e0c9..f2d99159a4 100644
--- a/package.json
+++ b/package.json
@@ -53,39 +53,6 @@
"typescript": "^4.9.5",
"vitest": "^0.28.5"
},
- "eslintConfig": {
- "root": true,
- "extends": [
- "eslint:recommended",
- "plugin:@typescript-eslint/recommended",
- "plugin:prettier/recommended"
- ],
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "project": [
- "./tsconfig.json"
- ]
- },
- "plugins": [
- "@typescript-eslint"
- ],
- "rules": {
- "prettier/prettier": "warn"
- },
- "reportUnusedDisableDirectives": true,
- "ignorePatterns": [
- "package/**/dist/*",
- "package/**/.babelrc.js",
- "package/**/sync.js",
- "src/**/*.test.ts",
- "**/webpack.config.js",
- "**/scripts/*.js",
- "**/node_modules/**",
- ".github/**",
- "**/__tests__/**",
- "**/tests/**"
- ]
- },
"pnpm": {
"patchedDependencies": {
"@tauri-apps/api@1.2.0": "patches/@tauri-apps__api@1.2.0.patch",
diff --git a/packages/component/src/components/BlockSuiteEditor.tsx b/packages/component/src/components/BlockSuiteEditor.tsx
index 2547ce13a2..b5d214dea5 100644
--- a/packages/component/src/components/BlockSuiteEditor.tsx
+++ b/packages/component/src/components/BlockSuiteEditor.tsx
@@ -1,5 +1,5 @@
import { Editor, EditorProps } from '@blocksuite/react/editor';
-
+import React from 'react';
export type BlockSuiteEditorProps = EditorProps;
export const BlockSuiteEditor = (props: BlockSuiteEditorProps) => {
return ;
diff --git a/packages/component/src/styles/styled.tsx b/packages/component/src/styles/styled.tsx
index ade405c725..8f49ce848c 100644
--- a/packages/component/src/styles/styled.tsx
+++ b/packages/component/src/styles/styled.tsx
@@ -1,6 +1,7 @@
import { ThemeProvider as EmotionThemeProvider } from '@emotion/react';
import emotionStyled from '@emotion/styled';
import type { PropsWithChildren } from 'react';
+import React from 'react';
import { AffineTheme } from './types';
export { css, keyframes } from '@emotion/react';
diff --git a/packages/component/src/ui/button/Button.tsx b/packages/component/src/ui/button/Button.tsx
index 7a085036b4..04023057fa 100644
--- a/packages/component/src/ui/button/Button.tsx
+++ b/packages/component/src/ui/button/Button.tsx
@@ -1,10 +1,10 @@
import { Children, cloneElement, forwardRef } from 'react';
+import React from 'react';
import { ButtonProps } from './interface';
import { Loading } from './Loading';
import { StyledButton } from './styles';
import { getSize } from './utils';
-
export const Button = forwardRef(
(
{
diff --git a/packages/component/src/ui/button/IconButton.tsx b/packages/component/src/ui/button/IconButton.tsx
index 3611dc2cbe..4f0daf149c 100644
--- a/packages/component/src/ui/button/IconButton.tsx
+++ b/packages/component/src/ui/button/IconButton.tsx
@@ -6,9 +6,9 @@ import {
HTMLAttributes,
ReactElement,
} from 'react';
+import React from 'react';
import { StyledIconButton } from './styles';
-
const SIZE_SMALL = 'small' as const;
const SIZE_MIDDLE = 'middle' as const;
const SIZE_NORMAL = 'normal' as const;
diff --git a/packages/component/src/ui/button/Loading.tsx b/packages/component/src/ui/button/Loading.tsx
index 60a7c996c4..7d6d654be1 100644
--- a/packages/component/src/ui/button/Loading.tsx
+++ b/packages/component/src/ui/button/Loading.tsx
@@ -1,7 +1,8 @@
+import React from 'react';
+
import { styled } from '../../styles';
import { ButtonProps } from './interface';
import { getButtonColors } from './utils';
-
export const LoadingContainer = styled('div')>(
({ theme, type = 'default' }) => {
const { color } = getButtonColors(theme, type, false);
diff --git a/packages/component/src/ui/button/TextButton.tsx b/packages/component/src/ui/button/TextButton.tsx
index b7cac00415..64037c02cf 100644
--- a/packages/component/src/ui/button/TextButton.tsx
+++ b/packages/component/src/ui/button/TextButton.tsx
@@ -1,9 +1,9 @@
import { Children, cloneElement, forwardRef } from 'react';
+import React from 'react';
import { ButtonProps } from './interface';
import { StyledTextButton } from './styles';
import { getSize } from './utils';
-
export const TextButton = forwardRef(
(
{
diff --git a/packages/component/src/ui/confirm/Confirm.tsx b/packages/component/src/ui/confirm/Confirm.tsx
index 75a5488d06..2728620674 100644
--- a/packages/component/src/ui/confirm/Confirm.tsx
+++ b/packages/component/src/ui/confirm/Confirm.tsx
@@ -1,5 +1,6 @@
import { useTranslation } from '@affine/i18n';
import { useState } from 'react';
+import React from 'react';
import { Button } from '../button';
import { Modal, ModalCloseButton, ModalProps } from '../modal';
diff --git a/packages/component/src/ui/empty/Empty.tsx b/packages/component/src/ui/empty/Empty.tsx
index 7309b25595..1dbfb8d4a2 100644
--- a/packages/component/src/ui/empty/Empty.tsx
+++ b/packages/component/src/ui/empty/Empty.tsx
@@ -1,8 +1,8 @@
import { CSSProperties } from 'react';
+import React from 'react';
import { EmptySVG } from './EmptySVG';
import { StyledEmptyContainer } from './style';
-
export type EmptyContentProps = {
imageStyle?: CSSProperties;
description?: string;
diff --git a/packages/component/src/ui/empty/EmptySVG.tsx b/packages/component/src/ui/empty/EmptySVG.tsx
index a6a0fce58e..943e6af640 100644
--- a/packages/component/src/ui/empty/EmptySVG.tsx
+++ b/packages/component/src/ui/empty/EmptySVG.tsx
@@ -1,4 +1,5 @@
import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon';
+import React from 'react';
export const EmptySVG = (props: SvgIconProps) => {
return (
diff --git a/packages/component/src/ui/input/Input.tsx b/packages/component/src/ui/input/Input.tsx
index 32df1c1add..ea9b2981c5 100644
--- a/packages/component/src/ui/input/Input.tsx
+++ b/packages/component/src/ui/input/Input.tsx
@@ -6,9 +6,9 @@ import {
useEffect,
useState,
} from 'react';
+import React from 'react';
import { StyledInput } from './style';
-
type inputProps = {
value?: string;
placeholder?: string;
diff --git a/packages/component/src/ui/menu/Menu.tsx b/packages/component/src/ui/menu/Menu.tsx
index c9bd531d59..fbf40a4307 100644
--- a/packages/component/src/ui/menu/Menu.tsx
+++ b/packages/component/src/ui/menu/Menu.tsx
@@ -1,8 +1,8 @@
import { TooltipProps } from '@mui/material';
+import React from 'react';
import { Popper, type PopperProps } from '../popper';
import { StyledMenuWrapper } from './styles';
-
export const Menu = (props: PopperProps & Omit) => {
const { content, placement = 'bottom-start', children } = props;
return content ? (
diff --git a/packages/component/src/ui/menu/MenuItem.tsx b/packages/component/src/ui/menu/MenuItem.tsx
index b23a0d79bf..bb5783c5e4 100644
--- a/packages/component/src/ui/menu/MenuItem.tsx
+++ b/packages/component/src/ui/menu/MenuItem.tsx
@@ -5,9 +5,9 @@ import {
PropsWithChildren,
ReactElement,
} from 'react';
+import React from 'react';
import { StyledArrow, StyledMenuItem } from './styles';
-
export type IconMenuProps = PropsWithChildren<{
isDir?: boolean;
icon?: ReactElement;
diff --git a/packages/component/src/ui/modal/Modal.tsx b/packages/component/src/ui/modal/Modal.tsx
index 72d20a5869..3dba76ea30 100644
--- a/packages/component/src/ui/modal/Modal.tsx
+++ b/packages/component/src/ui/modal/Modal.tsx
@@ -1,8 +1,8 @@
import { ModalUnstyledOwnProps } from '@mui/base/ModalUnstyled';
import Fade from '@mui/material/Fade';
+import React from 'react';
import { StyledBackdrop, StyledModal } from './styles';
-
const Backdrop = ({
open,
...other
diff --git a/packages/component/src/ui/modal/ModalCloseButton.tsx b/packages/component/src/ui/modal/ModalCloseButton.tsx
index 9890c8ad7d..8f1ace1329 100644
--- a/packages/component/src/ui/modal/ModalCloseButton.tsx
+++ b/packages/component/src/ui/modal/ModalCloseButton.tsx
@@ -1,5 +1,6 @@
import { CloseIcon } from '@blocksuite/icons';
import { HTMLAttributes } from 'react';
+import React from 'react';
import { styled } from '../../styles';
import { IconButton, IconButtonProps } from '../button/IconButton';
diff --git a/packages/component/src/ui/popper/PopoverArrow.tsx b/packages/component/src/ui/popper/PopoverArrow.tsx
index 1f49d5da52..f65253104a 100644
--- a/packages/component/src/ui/popper/PopoverArrow.tsx
+++ b/packages/component/src/ui/popper/PopoverArrow.tsx
@@ -1,4 +1,5 @@
import { forwardRef } from 'react';
+import React from 'react';
import { styled } from '../../styles';
import { PopperArrowProps } from './interface';
diff --git a/packages/component/src/ui/popper/Popper.tsx b/packages/component/src/ui/popper/Popper.tsx
index 01791dfe8a..b6e9760592 100644
--- a/packages/component/src/ui/popper/Popper.tsx
+++ b/packages/component/src/ui/popper/Popper.tsx
@@ -9,6 +9,7 @@ import {
useRef,
useState,
} from 'react';
+import React from 'react';
import { styled } from '../../styles';
import { PopperProps, VirtualElement } from './interface';
diff --git a/packages/component/src/ui/table/Table.tsx b/packages/component/src/ui/table/Table.tsx
index def2a31cea..a9f892fc70 100644
--- a/packages/component/src/ui/table/Table.tsx
+++ b/packages/component/src/ui/table/Table.tsx
@@ -1,7 +1,7 @@
import { Children, HTMLAttributes, PropsWithChildren, ReactNode } from 'react';
+import React from 'react';
import { StyledTable } from './styles';
-
const childrenHasEllipsis = (children: ReactNode | ReactNode[]): boolean => {
return Children.toArray(children).some(child => {
if (typeof child === 'object' && 'props' in child) {
diff --git a/packages/component/src/ui/table/TableBody.tsx b/packages/component/src/ui/table/TableBody.tsx
index 112723d8df..c6bb9e425e 100644
--- a/packages/component/src/ui/table/TableBody.tsx
+++ b/packages/component/src/ui/table/TableBody.tsx
@@ -1,7 +1,7 @@
import { HTMLAttributes, PropsWithChildren } from 'react';
+import React from 'react';
import { StyledTableBody } from './styles';
-
export const TableBody = ({
children,
...props
diff --git a/packages/component/src/ui/table/TableCell.tsx b/packages/component/src/ui/table/TableCell.tsx
index b592770576..e9c788f770 100644
--- a/packages/component/src/ui/table/TableCell.tsx
+++ b/packages/component/src/ui/table/TableCell.tsx
@@ -1,8 +1,8 @@
import { HTMLAttributes, PropsWithChildren } from 'react';
+import React from 'react';
import { TableCellProps } from './interface';
import { StyledTableCell } from './styles';
-
export const TableCell = ({
children,
...props
diff --git a/packages/component/src/ui/table/TableHead.tsx b/packages/component/src/ui/table/TableHead.tsx
index c2cf83d01a..1a284094f0 100644
--- a/packages/component/src/ui/table/TableHead.tsx
+++ b/packages/component/src/ui/table/TableHead.tsx
@@ -1,4 +1,5 @@
import { HTMLAttributes, PropsWithChildren } from 'react';
+import React from 'react';
import { StyledTableHead } from './styles';
diff --git a/packages/component/src/ui/table/TableRow.tsx b/packages/component/src/ui/table/TableRow.tsx
index 55b9608794..7b8559c0e0 100644
--- a/packages/component/src/ui/table/TableRow.tsx
+++ b/packages/component/src/ui/table/TableRow.tsx
@@ -1,7 +1,7 @@
import { HTMLAttributes, PropsWithChildren } from 'react';
+import React from 'react';
import { StyledTableRow } from './styles';
-
export const TableRow = ({
children,
...props
diff --git a/packages/component/src/ui/tooltip/Tooltip.tsx b/packages/component/src/ui/tooltip/Tooltip.tsx
index 9af7c31be8..2f4b54560d 100644
--- a/packages/component/src/ui/tooltip/Tooltip.tsx
+++ b/packages/component/src/ui/tooltip/Tooltip.tsx
@@ -1,9 +1,9 @@
import type { TooltipProps } from '@mui/material';
+import React from 'react';
import { styled } from '../../styles';
import { Popper, type PopperProps } from '../popper';
import StyledPopperContainer from '../shared/Container';
-
const StyledTooltip = styled(StyledPopperContainer)(({ theme }) => {
return {
maxWidth: '320px',
diff --git a/packages/logger/pages/index.tsx b/packages/logger/pages/index.tsx
index 5e3f2d3581..b9a0c9da75 100644
--- a/packages/logger/pages/index.tsx
+++ b/packages/logger/pages/index.tsx
@@ -1,3 +1,5 @@
+import React from 'react';
+
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
import { Logger } from '../src';
diff --git a/tests/console.spec.ts b/tests/console.spec.ts
index 4114dccfc9..b0cf7b9a4f 100644
--- a/tests/console.spec.ts
+++ b/tests/console.spec.ts
@@ -9,6 +9,13 @@ const pkgPath = path.join(__dirname, '../apps/web/package.json');
const record = fs.readFileSync(pkgPath, 'utf8');
const temp = JSON.parse(record);
loadPage();
+
+declare global {
+ interface Window {
+ __editoVersion: unknown;
+ }
+}
+
test.describe('web console', () => {
test('editor version', async ({ page }) => {
const pkgEditorVersion = temp.dependencies['@blocksuite/editor'];