From b383ce36cd43d9da2b32c3e88d0bd9edfa5af09e Mon Sep 17 00:00:00 2001 From: Himself65 Date: Fri, 9 Jun 2023 01:42:58 +0800 Subject: [PATCH] build: enhance tsconfig type check (#2732) --- .../main/src/updater/electron-updater.ts | 3 +- apps/electron/layers/preload/src/bootstrap.ts | 10 ++- apps/server/src/modules/auth/guard.ts | 9 +-- apps/server/src/modules/auth/resolver.ts | 2 +- apps/server/src/modules/auth/service.ts | 2 +- apps/server/src/tests/app.e2e.ts | 2 +- apps/server/src/utils/nestjs.ts | 11 ++-- .../affine/affine-error-eoundary.tsx | 6 +- .../block-suite-page-list/index.tsx | 1 + apps/web/src/layouts/workspace-layout.tsx | 1 + apps/web/src/pages/_document.tsx | 4 +- apps/web/src/pages/index.tsx | 1 + .../components/app-sidebar/spolight/index.tsx | 1 + .../components/block-suite-editor/index.tsx | 1 + .../image-preview-modal/index.jotai.ts | 1 + .../components/notification-center/index.tsx | 2 + .../src/components/page-list/index.tsx | 3 + .../src/components/share-menu/index.tsx | 2 + packages/component/src/ui/tree-view/utils.ts | 1 + packages/env/package.json | 1 + .../use-block-suite-workspace-avatar-url.ts | 1 + packages/i18n/src/index.ts | 1 + packages/i18n/src/scripts/download.ts | 4 +- packages/i18n/src/scripts/sync.ts | 10 +-- .../src/stories/page-list.stories.tsx | 10 +-- .../src/stories/share-menu.stories.tsx | 6 +- packages/storybook/tsconfig.json | 6 +- packages/storybook/tsconfig.node.json | 2 +- packages/workspace/src/affine/login.ts | 1 + packages/workspace/src/atom.ts | 2 + packages/workspace/src/utils.ts | 4 +- packages/y-indexeddb/src/utils.ts | 1 + .../src/core/langchain/vector-store.ts | 4 +- tsconfig.json | 63 ++++++++++++++----- 34 files changed, 111 insertions(+), 68 deletions(-) diff --git a/apps/electron/layers/main/src/updater/electron-updater.ts b/apps/electron/layers/main/src/updater/electron-updater.ts index 9efe726790..eebc193470 100644 --- a/apps/electron/layers/main/src/updater/electron-updater.ts +++ b/apps/electron/layers/main/src/updater/electron-updater.ts @@ -29,13 +29,14 @@ export const quitAndInstall = async () => { let lastCheckTime = 0; export const checkForUpdatesAndNotify = async (force = true) => { if (!_autoUpdater) { - return; // ? + return void 0; } // check every 30 minutes (1800 seconds) at most if (force || lastCheckTime + 1000 * 1800 < Date.now()) { lastCheckTime = Date.now(); return await _autoUpdater.checkForUpdatesAndNotify(); } + return void 0; }; export const registerUpdater = async () => { diff --git a/apps/electron/layers/preload/src/bootstrap.ts b/apps/electron/layers/preload/src/bootstrap.ts index ecc67890e4..fc4e364db7 100644 --- a/apps/electron/layers/preload/src/bootstrap.ts +++ b/apps/electron/layers/preload/src/bootstrap.ts @@ -27,6 +27,7 @@ import { contextBridge, ipcRenderer } from 'electron'; if (validateIPC(channel)) { return ipcRenderer.invoke(channel, ...args); } + return void 0; }, on( @@ -35,9 +36,8 @@ import { contextBridge, ipcRenderer } from 'electron'; ) { if (validateIPC(channel)) { ipcRenderer.on(channel, listener); - - return this; } + return this; }, once( @@ -46,9 +46,8 @@ import { contextBridge, ipcRenderer } from 'electron'; ) { if (validateIPC(channel)) { ipcRenderer.once(channel, listener); - - return this; } + return this; }, removeListener( @@ -57,9 +56,8 @@ import { contextBridge, ipcRenderer } from 'electron'; ) { if (validateIPC(channel)) { ipcRenderer.removeListener(channel, listener); - - return this; } + return this; }, }, }; diff --git a/apps/server/src/modules/auth/guard.ts b/apps/server/src/modules/auth/guard.ts index 1b70fb5705..60528ffbb7 100644 --- a/apps/server/src/modules/auth/guard.ts +++ b/apps/server/src/modules/auth/guard.ts @@ -1,10 +1,5 @@ -import { - CanActivate, - createParamDecorator, - ExecutionContext, - Injectable, - UseGuards, -} from '@nestjs/common'; +import type { CanActivate, ExecutionContext } from '@nestjs/common'; +import { createParamDecorator, Injectable, UseGuards } from '@nestjs/common'; import { PrismaService } from '../../prisma'; import { getRequestResponseFromContext } from '../../utils/nestjs'; diff --git a/apps/server/src/modules/auth/resolver.ts b/apps/server/src/modules/auth/resolver.ts index 66d4466e17..0b33c88eec 100644 --- a/apps/server/src/modules/auth/resolver.ts +++ b/apps/server/src/modules/auth/resolver.ts @@ -9,7 +9,7 @@ import { ResolveField, Resolver, } from '@nestjs/graphql'; -import { Request } from 'express'; +import type { Request } from 'express'; import { UserType } from '../users/resolver'; import { CurrentUser } from './guard'; diff --git a/apps/server/src/modules/auth/service.ts b/apps/server/src/modules/auth/service.ts index 906d2245f2..16c80d1383 100644 --- a/apps/server/src/modules/auth/service.ts +++ b/apps/server/src/modules/auth/service.ts @@ -4,7 +4,7 @@ import { UnauthorizedException, } from '@nestjs/common'; import { compare, hash } from '@node-rs/bcrypt'; -import { User } from '@prisma/client'; +import type { User } from '@prisma/client'; import jwt from 'jsonwebtoken'; import { Config } from '../../config'; diff --git a/apps/server/src/tests/app.e2e.ts b/apps/server/src/tests/app.e2e.ts index 3d8b6ed9d5..72af71009a 100644 --- a/apps/server/src/tests/app.e2e.ts +++ b/apps/server/src/tests/app.e2e.ts @@ -1,7 +1,7 @@ import { equal, ok } from 'node:assert'; import { afterEach, beforeEach, describe, test } from 'node:test'; -import { INestApplication } from '@nestjs/common'; +import type { INestApplication } from '@nestjs/common'; import { Test } from '@nestjs/testing'; import { hash } from '@node-rs/bcrypt'; import { PrismaClient } from '@prisma/client'; diff --git a/apps/server/src/utils/nestjs.ts b/apps/server/src/utils/nestjs.ts index 27129a2dee..7da39a15d2 100644 --- a/apps/server/src/utils/nestjs.ts +++ b/apps/server/src/utils/nestjs.ts @@ -1,10 +1,7 @@ -import { ArgumentsHost, ExecutionContext } from '@nestjs/common'; -import { - GqlArgumentsHost, - GqlContextType, - GqlExecutionContext, -} from '@nestjs/graphql'; -import { Request, Response } from 'express'; +import type { ArgumentsHost, ExecutionContext } from '@nestjs/common'; +import type { GqlContextType } from '@nestjs/graphql'; +import { GqlArgumentsHost, GqlExecutionContext } from '@nestjs/graphql'; +import type { Request, Response } from 'express'; export function getRequestResponseFromContext(context: ExecutionContext) { switch (context.getType()) { diff --git a/apps/web/src/components/affine/affine-error-eoundary.tsx b/apps/web/src/components/affine/affine-error-eoundary.tsx index 2cd79fe52b..a47039fada 100644 --- a/apps/web/src/components/affine/affine-error-eoundary.tsx +++ b/apps/web/src/components/affine/affine-error-eoundary.tsx @@ -30,7 +30,7 @@ export class AffineErrorBoundary extends Component< AffineErrorBoundaryProps, AffineErrorBoundaryState > { - public state: AffineErrorBoundaryState = { + public override state: AffineErrorBoundaryState = { error: null, }; @@ -40,11 +40,11 @@ export class AffineErrorBoundary extends Component< return { error }; } - public componentDidCatch(error: AffineError, errorInfo: ErrorInfo) { + public override componentDidCatch(error: AffineError, errorInfo: ErrorInfo) { console.error('Uncaught error:', error, errorInfo); } - public render(): ReactNode { + public override render(): ReactNode { if (this.state.error) { const error = this.state.error; if (error instanceof PageNotFoundError) { diff --git a/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx b/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx index e97c3b5df7..3f673d56e9 100644 --- a/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx +++ b/apps/web/src/components/blocksuite/block-suite-page-list/index.tsx @@ -80,6 +80,7 @@ const PageListEmpty = (props: { if (listType === 'shared') { return t['emptySharedPages'](); } + return; }; return ( diff --git a/apps/web/src/layouts/workspace-layout.tsx b/apps/web/src/layouts/workspace-layout.tsx index d0d5f29558..f41a3a533b 100644 --- a/apps/web/src/layouts/workspace-layout.tsx +++ b/apps/web/src/layouts/workspace-layout.tsx @@ -268,6 +268,7 @@ export const WorkspaceLayout: FC = affineGlobalChannel.disconnect(); }; } + return; }, [currentWorkspaceId, jotaiWorkspaces]); const Provider = diff --git a/apps/web/src/pages/_document.tsx b/apps/web/src/pages/_document.tsx index 70eebee636..f54e162d68 100644 --- a/apps/web/src/pages/_document.tsx +++ b/apps/web/src/pages/_document.tsx @@ -12,7 +12,7 @@ const description = export default class AppDocument extends Document<{ emotionStyleTags: EmotionJSX.Element[]; }> { - static getInitialProps = async (ctx: DocumentContext) => { + static override getInitialProps = async (ctx: DocumentContext) => { const originalRenderPage = ctx.renderPage; const cache = createEmotionCache(); @@ -41,7 +41,7 @@ export default class AppDocument extends Document<{ emotionStyleTags, }; }; - render() { + override render() { return ( diff --git a/apps/web/src/pages/index.tsx b/apps/web/src/pages/index.tsx index 1253023e8c..739b4607bc 100644 --- a/apps/web/src/pages/index.tsx +++ b/apps/web/src/pages/index.tsx @@ -63,6 +63,7 @@ const IndexPageInner = () => { } else { console.warn('No target workspace. This should not happen in production'); } + return; }, [helper, jumpToPage, jumpToSubPath, router, workspaces]); return ( diff --git a/packages/component/src/components/app-sidebar/spolight/index.tsx b/packages/component/src/components/app-sidebar/spolight/index.tsx index 4bd06468b4..5e20f0a5b3 100644 --- a/packages/component/src/components/app-sidebar/spolight/index.tsx +++ b/packages/component/src/components/app-sidebar/spolight/index.tsx @@ -30,6 +30,7 @@ function useMouseOffset() { el.removeEventListener('mouseleave', onMouseLeave); }; } + return () => {}; }, []); return [offset, outside, ref] as const; diff --git a/packages/component/src/components/block-suite-editor/index.tsx b/packages/component/src/components/block-suite-editor/index.tsx index 73f1b25232..1aee076d3c 100644 --- a/packages/component/src/components/block-suite-editor/index.tsx +++ b/packages/component/src/components/block-suite-editor/index.tsx @@ -80,6 +80,7 @@ const BlockSuiteEditorImpl = (props: EditorProps): ReactElement => { .forEach(dispose => dispose()); }; } + return () => {}; }, [editor, editor.page, page, onLoad]); const ref = useRef(null); diff --git a/packages/component/src/components/image-preview-modal/index.jotai.ts b/packages/component/src/components/image-preview-modal/index.jotai.ts index f19968f02d..de04be0408 100644 --- a/packages/component/src/components/image-preview-modal/index.jotai.ts +++ b/packages/component/src/components/image-preview-modal/index.jotai.ts @@ -13,4 +13,5 @@ previewBlockIdAtom.onMount = set => { window.removeEventListener('affine.embed-block-db-click', callback); }; } + return () => {}; }; diff --git a/packages/component/src/components/notification-center/index.tsx b/packages/component/src/components/notification-center/index.tsx index 319c7a5dfc..d34250b552 100644 --- a/packages/component/src/components/notification-center/index.tsx +++ b/packages/component/src/components/notification-center/index.tsx @@ -183,6 +183,7 @@ function NotificationCard(props: NotificationCardProps): ReactElement { if (notification.undo) { return notification.undo(); } + return void 0; }, [notification]); useEffect(() => { @@ -200,6 +201,7 @@ function NotificationCard(props: NotificationCardProps): ReactElement { h.filter(height => height.notificationKey !== notification.key) ); } + return () => {}; }, [notification.key, setHeights]); return ( ( } } } + return undefined; } diff --git a/packages/env/package.json b/packages/env/package.json index fd68714df2..706c60adb8 100644 --- a/packages/env/package.json +++ b/packages/env/package.json @@ -12,6 +12,7 @@ }, "exports": { ".": "./src/index.ts", + "./api": "./src/api.ts", "./config": "./src/config.ts", "./constant": "./src/constant.ts", "./workspace": "./src/workspace.ts", diff --git a/packages/hooks/src/use-block-suite-workspace-avatar-url.ts b/packages/hooks/src/use-block-suite-workspace-avatar-url.ts index 7bd7f760af..799fd67b01 100644 --- a/packages/hooks/src/use-block-suite-workspace-avatar-url.ts +++ b/packages/hooks/src/use-block-suite-workspace-avatar-url.ts @@ -43,6 +43,7 @@ export function useBlockSuiteWorkspaceAvatarUrl( dispose.dispose(); }; } + return () => {}; }, [blockSuiteWorkspace]); return [avatar ?? null, setAvatar] as const; } diff --git a/packages/i18n/src/index.ts b/packages/i18n/src/index.ts index 7939babdb8..5096ef6e40 100644 --- a/packages/i18n/src/index.ts +++ b/packages/i18n/src/index.ts @@ -102,6 +102,7 @@ export function setUpLanguage(i: i18n) { } return i.changeLanguage(language); } + return void 0; } // const I18nProvider = I18nextProvider; diff --git a/packages/i18n/src/scripts/download.ts b/packages/i18n/src/scripts/download.ts index 45d9fca627..c872eed136 100644 --- a/packages/i18n/src/scripts/download.ts +++ b/packages/i18n/src/scripts/download.ts @@ -1,6 +1,6 @@ // cSpell:ignore Tolgee -import fs from 'node:fs/promises'; -import path from 'node:path'; +import * as fs from 'node:fs/promises'; +import * as path from 'node:path'; import { format } from 'prettier'; diff --git a/packages/i18n/src/scripts/sync.ts b/packages/i18n/src/scripts/sync.ts index 8f356c4d1e..755240931a 100644 --- a/packages/i18n/src/scripts/sync.ts +++ b/packages/i18n/src/scripts/sync.ts @@ -1,16 +1,12 @@ // cSpell:ignore Tolgee +import { resolve } from 'node:path'; + import { readFile } from 'fs/promises'; -import path from 'path'; import { createsNewKey, getRemoteTranslations } from './api.js'; import type { TranslationRes } from './utils.js'; -const BASE_JSON_PATH = path.resolve( - process.cwd(), - 'src', - 'resources', - 'en.json' -); +const BASE_JSON_PATH = resolve(process.cwd(), 'src', 'resources', 'en.json'); const BASE_LANGUAGES = 'en' as const; /** diff --git a/packages/storybook/src/stories/page-list.stories.tsx b/packages/storybook/src/stories/page-list.stories.tsx index 7f32f097af..bb6c40dcec 100644 --- a/packages/storybook/src/stories/page-list.stories.tsx +++ b/packages/storybook/src/stories/page-list.stories.tsx @@ -1,11 +1,11 @@ import { Empty } from '@affine/component'; import { toast } from '@affine/component'; import { AffineLoading } from '@affine/component/affine-loading'; -import { PageListTrashView } from '@affine/component/page-list/all-page'; -import { PageList } from '@affine/component/page-list/all-page'; -import { NewPageButton } from '@affine/component/page-list/components/new-page-buttton'; -import type { OperationCellProps } from '@affine/component/page-list/operation-cell'; -import { OperationCell } from '@affine/component/page-list/operation-cell'; +import type { OperationCellProps } from '@affine/component/page-list'; +import { PageListTrashView } from '@affine/component/page-list'; +import { PageList } from '@affine/component/page-list'; +import { NewPageButton } from '@affine/component/page-list'; +import { OperationCell } from '@affine/component/page-list'; import { PageIcon } from '@blocksuite/icons'; import { expect } from '@storybook/jest'; import type { StoryFn } from '@storybook/react'; diff --git a/packages/storybook/src/stories/share-menu.stories.tsx b/packages/storybook/src/stories/share-menu.stories.tsx index 4ec92a8205..f9f78fc874 100644 --- a/packages/storybook/src/stories/share-menu.stories.tsx +++ b/packages/storybook/src/stories/share-menu.stories.tsx @@ -1,7 +1,9 @@ import { toast } from '@affine/component'; -import { PublicLinkDisableModal } from '@affine/component/share-menu/disable-public-link'; +import { + PublicLinkDisableModal, + StyledDisableButton, +} from '@affine/component/share-menu'; import { ShareMenu } from '@affine/component/share-menu/share-menu'; -import { StyledDisableButton } from '@affine/component/share-menu/styles'; import type { AffineLegacyCloudWorkspace, LocalWorkspace, diff --git a/packages/storybook/tsconfig.json b/packages/storybook/tsconfig.json index 1acec90d8b..fa67cb8cca 100644 --- a/packages/storybook/tsconfig.json +++ b/packages/storybook/tsconfig.json @@ -4,7 +4,11 @@ "compilerOptions": { "composite": true, "noEmit": false, - "outDir": "lib" + "outDir": "lib", + "paths": { + "@affine/component": ["../component/src"], + "@affine/component/*": ["../component/src/components/*"] + } }, "references": [ { diff --git a/packages/storybook/tsconfig.node.json b/packages/storybook/tsconfig.node.json index 270a108650..ee58c84424 100644 --- a/packages/storybook/tsconfig.node.json +++ b/packages/storybook/tsconfig.node.json @@ -1,5 +1,5 @@ { - "extends": "./tsconfig.json", + "extends": "../../tsconfig.json", "compilerOptions": { "composite": true, "module": "ESNext", diff --git a/packages/workspace/src/affine/login.ts b/packages/workspace/src/affine/login.ts index ebfca959d1..9b85c1efc3 100644 --- a/packages/workspace/src/affine/login.ts +++ b/packages/workspace/src/affine/login.ts @@ -75,6 +75,7 @@ const signInWithElectron = async (firebaseAuth: FirebaseAuth) => { const user = await signInWithCredential(firebaseAuth, credential); return await user.user.getIdToken(); } + return void 0; }; export const clearLoginStorage = () => { diff --git a/packages/workspace/src/atom.ts b/packages/workspace/src/atom.ts index 10836560b0..4a5e4dd87f 100644 --- a/packages/workspace/src/atom.ts +++ b/packages/workspace/src/atom.ts @@ -48,6 +48,7 @@ rootCurrentWorkspaceIdAtom.onMount = set => { Router.events.off('routeChangeStart', callback); }; } + return () => {}; }; export const rootCurrentPageIdAtom = atom(null); @@ -68,6 +69,7 @@ rootCurrentPageIdAtom.onMount = set => { Router.events.off('routeChangeStart', callback); }; } + return () => {}; }; // current editor atom, each app should have only one editor in the same time diff --git a/packages/workspace/src/utils.ts b/packages/workspace/src/utils.ts index cfc379b1e0..584ad14b0e 100644 --- a/packages/workspace/src/utils.ts +++ b/packages/workspace/src/utils.ts @@ -101,7 +101,7 @@ export class CallbackSet extends Set<() => void> { this.#ready = v; } - add(cb: () => void) { + override add(cb: () => void) { if (this.ready) { cb(); return this; @@ -112,7 +112,7 @@ export class CallbackSet extends Set<() => void> { return super.add(cb); } - delete(cb: () => void) { + override delete(cb: () => void) { if (this.has(cb)) { return super.delete(cb); } diff --git a/packages/y-indexeddb/src/utils.ts b/packages/y-indexeddb/src/utils.ts index 79300b75cc..be153ba799 100644 --- a/packages/y-indexeddb/src/utils.ts +++ b/packages/y-indexeddb/src/utils.ts @@ -117,6 +117,7 @@ export async function tryMigrate( } ); } + return void 0; }) ); localStorage.setItem(`${dbName}-migration`, 'true'); diff --git a/plugins/copilot/src/core/langchain/vector-store.ts b/plugins/copilot/src/core/langchain/vector-store.ts index ce33497545..32a96d723c 100644 --- a/plugins/copilot/src/core/langchain/vector-store.ts +++ b/plugins/copilot/src/core/langchain/vector-store.ts @@ -80,7 +80,7 @@ export class IndexedDBVectorStore extends VectorStore { return result; } - static async fromTexts( + static override async fromTexts( texts: string[], metadatas: object[] | object, embeddings: Embeddings, @@ -98,7 +98,7 @@ export class IndexedDBVectorStore extends VectorStore { return IndexedDBVectorStore.fromDocuments(docs, embeddings, dbConfig); } - static async fromDocuments( + static override async fromDocuments( docs: Document[], embeddings: Embeddings, dbConfig?: MemoryVectorStoreArgs diff --git a/tsconfig.json b/tsconfig.json index d71967dd32..5c0eb35e4b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,57 @@ { "compilerOptions": { - "rootDir": ".", - "target": "ESNext", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, + "verbatimModuleSyntax": true, + // Classification follows https://www.typescriptlang.org/tsconfig + + // Type Checking "strict": true, - "forceConsistentCasingInFileNames": true, - // FIXME: add this back - "noUncheckedIndexedAccess": false, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", + // exactOptionalPropertyTypes: false, + "noFallthroughCasesInSwitch": true, + "noImplicitAny": true, + "noImplicitOverride": true, + "noImplicitReturns": true, + "noImplicitThis": true, + // noPropertyAccessFromIndexSignature: false, + // noUncheckedIndexedAccess: false, + // noUnusedLocals: false, + // noUnusedParameters: false, + "useUnknownInCatchVariables": true, + + // Modules + "module": "ES2022", + "moduleResolution": "Node", "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - // Project - "incremental": true, - "composite": true, + // Emit + "declaration": true, + "declarationMap": true, + "sourceMap": true, + // skip type emit for @internal types + // "stripInternal": true, + // JavaScript Support + "allowJs": false, + "checkJs": false, + + // Interop Constraints + "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, + + // Language and Environment + "jsx": "react-jsx", + "lib": ["ES2023", "DOM", "DOM.Iterable"], + "target": "ES2022", + "useDefineForClassFields": true, "experimentalDecorators": true, "emitDecoratorMetadata": true, - "baseUrl": ".", + + // Projects + "composite": true, + "incremental": true, + + // Completeness + "skipLibCheck": true, // skip all type checks for .d.ts files + "paths": { "@affine/component": ["./packages/component/src/index"], "@affine/component/*": [