diff --git a/.eslintrc.js b/.eslintrc.js index 2bac52fb9..5e5566f17 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -270,6 +270,7 @@ const config = { }, ], '@typescript-eslint/no-misused-promises': ['error'], + '@typescript-eslint/prefer-readonly': 'error', 'i/no-extraneous-dependencies': ['error'], 'react-hooks/exhaustive-deps': [ 'warn', diff --git a/packages/backend/server/src/middleware/exception-logger.ts b/packages/backend/server/src/middleware/exception-logger.ts index 89abbd02e..4e4c97d3c 100644 --- a/packages/backend/server/src/middleware/exception-logger.ts +++ b/packages/backend/server/src/middleware/exception-logger.ts @@ -14,7 +14,7 @@ const TrivialExceptions = [NotFoundException]; @Catch() export class ExceptionLogger implements ExceptionFilter { - private logger = new Logger('ExceptionLogger'); + private readonly logger = new Logger('ExceptionLogger'); catch(exception: Error, host: ArgumentsHost) { // with useGlobalFilters, the context is always HTTP diff --git a/packages/backend/server/src/modules/auth/guard.ts b/packages/backend/server/src/modules/auth/guard.ts index 6b4532354..7e311159d 100644 --- a/packages/backend/server/src/modules/auth/guard.ts +++ b/packages/backend/server/src/modules/auth/guard.ts @@ -53,8 +53,8 @@ class AuthGuard implements CanActivate { constructor( @Inject(NextAuthOptionsProvide) private readonly nextAuthOptions: NextAuthOptions, - private auth: AuthService, - private prisma: PrismaService, + private readonly auth: AuthService, + private readonly prisma: PrismaService, private readonly reflector: Reflector ) {} diff --git a/packages/backend/server/src/modules/auth/service.ts b/packages/backend/server/src/modules/auth/service.ts index a852374ec..b6150a65d 100644 --- a/packages/backend/server/src/modules/auth/service.ts +++ b/packages/backend/server/src/modules/auth/service.ts @@ -28,9 +28,9 @@ export const getUtcTimestamp = () => Math.floor(Date.now() / 1000); @Injectable() export class AuthService { constructor( - private config: Config, - private prisma: PrismaService, - private mailer: MailService + private readonly config: Config, + private readonly prisma: PrismaService, + private readonly mailer: MailService ) {} sign(user: UserClaim) { diff --git a/packages/backend/server/src/modules/doc/manager.ts b/packages/backend/server/src/modules/doc/manager.ts index a31bc1a84..3362bc5ce 100644 --- a/packages/backend/server/src/modules/doc/manager.ts +++ b/packages/backend/server/src/modules/doc/manager.ts @@ -60,9 +60,9 @@ const MAX_SEQ_NUM = 0x3fffffff; // u31 */ @Injectable() export class DocManager implements OnModuleInit, OnModuleDestroy { - private logger = new Logger(DocManager.name); + private readonly logger = new Logger(DocManager.name); private job: NodeJS.Timeout | null = null; - private seqMap = new Map(); + private readonly seqMap = new Map(); private busy = false; constructor( diff --git a/packages/backend/server/src/utils/doc.ts b/packages/backend/server/src/utils/doc.ts index 7230b05a1..52c59204c 100644 --- a/packages/backend/server/src/utils/doc.ts +++ b/packages/backend/server/src/utils/doc.ts @@ -16,7 +16,7 @@ export class DocID { raw: string; workspace: string; variant: DocVariant; - private sub: string | null; + private readonly sub: string | null; static parse(raw: string): DocID | null { try { diff --git a/packages/common/debug/src/index.ts b/packages/common/debug/src/index.ts index d943e27fd..b805541cf 100644 --- a/packages/common/debug/src/index.ts +++ b/packages/common/debug/src/index.ts @@ -24,7 +24,7 @@ if (typeof window !== 'undefined') { } export class DebugLogger { - private _debug: debug.Debugger; + private readonly _debug: debug.Debugger; constructor(namespace: string) { this._debug = debug(namespace); diff --git a/packages/common/env/src/ua-helper.ts b/packages/common/env/src/ua-helper.ts index 66a685dce..fc372b6d9 100644 --- a/packages/common/env/src/ua-helper.ts +++ b/packages/common/env/src/ua-helper.ts @@ -1,7 +1,7 @@ import { assertExists } from '@blocksuite/global/utils'; export class UaHelper { - private uaMap; + private readonly uaMap; public isLinux = false; public isMacOs = false; public isSafari = false; diff --git a/packages/common/infra/src/type.ts b/packages/common/infra/src/type.ts index e998db425..cd459f2ec 100644 --- a/packages/common/infra/src/type.ts +++ b/packages/common/infra/src/type.ts @@ -45,8 +45,8 @@ export abstract class HandlerManager< Handlers extends Record, > { static instance: HandlerManager>; - private _app: App; - private _namespace: Namespace; + private readonly _app: App; + private readonly _namespace: Namespace; private _handlers: Handlers; constructor() { diff --git a/packages/frontend/component/src/components/page-list/filter/logical/matcher.ts b/packages/frontend/component/src/components/page-list/filter/logical/matcher.ts index d7ffc5763..fe3574378 100644 --- a/packages/frontend/component/src/components/page-list/filter/logical/matcher.ts +++ b/packages/frontend/component/src/components/page-list/filter/logical/matcher.ts @@ -4,9 +4,11 @@ import { typesystem } from './typesystem'; type MatcherData = { type: Type; data: Data }; export class Matcher { - private list: MatcherData[] = []; + private readonly list: MatcherData[] = []; - constructor(private _match?: (type: Type, target: TType) => boolean) {} + constructor( + private readonly _match?: (type: Type, target: TType) => boolean + ) {} register(type: Type, data: Data) { this.list.push({ type, data }); diff --git a/packages/frontend/component/src/components/page-list/filter/logical/typesystem.ts b/packages/frontend/component/src/components/page-list/filter/logical/typesystem.ts index 5458e02e2..28345c372 100644 --- a/packages/frontend/component/src/components/page-list/filter/logical/typesystem.ts +++ b/packages/frontend/component/src/components/page-list/filter/logical/typesystem.ts @@ -92,8 +92,8 @@ export type ValueOfData = T extends DataDefine export class DataDefine> { constructor( - private config: DataDefineConfig, - private dataMap: Map + private readonly config: DataDefineConfig, + private readonly dataMap: Map ) {} create(data?: Data): TDataType { diff --git a/packages/frontend/core/src/utils/user-setting.ts b/packages/frontend/core/src/utils/user-setting.ts index 649304764..3a668b645 100644 --- a/packages/frontend/core/src/utils/user-setting.ts +++ b/packages/frontend/core/src/utils/user-setting.ts @@ -5,8 +5,8 @@ import type { Map as YMap } from 'yjs'; import { Doc as YDoc } from 'yjs'; export class UserSetting { constructor( - private workspace: Workspace, - private userId: string + private readonly workspace: Workspace, + private readonly userId: string ) {} get setting(): YDoc { diff --git a/packages/frontend/core/src/utils/workspace-setting.ts b/packages/frontend/core/src/utils/workspace-setting.ts index 18d034458..dacdc92ce 100644 --- a/packages/frontend/core/src/utils/workspace-setting.ts +++ b/packages/frontend/core/src/utils/workspace-setting.ts @@ -13,7 +13,7 @@ const COLLECTIONS_TRASH_KEY = 'collections_trash'; const SETTING_KEY = 'setting'; export class WorkspaceSetting { - constructor(private workspace: Workspace) {} + constructor(private readonly workspace: Workspace) {} get doc() { return this.workspace.doc; diff --git a/packages/frontend/electron/src/main/helper-process.ts b/packages/frontend/electron/src/main/helper-process.ts index ed73b096d..23b6da165 100644 --- a/packages/frontend/electron/src/main/helper-process.ts +++ b/packages/frontend/electron/src/main/helper-process.ts @@ -33,7 +33,7 @@ function pickAndBind( class HelperProcessManager { ready: Promise; - #process: UtilityProcess; + readonly #process: UtilityProcess; // a rpc server for the main process -> helper process rpc?: _AsyncVersionOf; diff --git a/packages/frontend/electron/src/main/updater/custom-github-provider.ts b/packages/frontend/electron/src/main/updater/custom-github-provider.ts index 9615b3c55..75a9861f6 100644 --- a/packages/frontend/electron/src/main/updater/custom-github-provider.ts +++ b/packages/frontend/electron/src/main/updater/custom-github-provider.ts @@ -29,7 +29,7 @@ const hrefRegExp = /\/tag\/([^/]+)$/; export class CustomGitHubProvider extends BaseGitHubProvider { constructor( options: CustomPublishOptions, - private updater: AppUpdater, + private readonly updater: AppUpdater, runtimeOptions: ProviderRuntimeOptions ) { super(options as unknown as GithubOptions, 'github.com', runtimeOptions); diff --git a/packages/frontend/electron/src/shared/utils.ts b/packages/frontend/electron/src/shared/utils.ts index b3fe238e8..b7e7438b1 100644 --- a/packages/frontend/electron/src/shared/utils.ts +++ b/packages/frontend/electron/src/shared/utils.ts @@ -22,7 +22,7 @@ interface MessagePortLike { } export class MessageEventChannel implements EventBasedChannel { - constructor(private worker: MessagePortLike) {} + constructor(private readonly worker: MessagePortLike) {} on(listener: (data: unknown) => void) { const f = (data: unknown) => { diff --git a/packages/frontend/graphql/src/utils.ts b/packages/frontend/graphql/src/utils.ts index 4e2a1f8e8..9c537d752 100644 --- a/packages/frontend/graphql/src/utils.ts +++ b/packages/frontend/graphql/src/utils.ts @@ -54,7 +54,7 @@ export class TraceReporter { private spansCache = new Array(); private reportIntervalId: number | undefined | NodeJS.Timeout; - private reportInterval = 60_000; + private readonly reportInterval = 60_000; private static instance: TraceReporter; @@ -175,7 +175,7 @@ export class TraceReporter { }; } - private initTraceReport = () => { + private readonly initTraceReport = () => { if (!this.reportIntervalId && TraceReporter.shouldReportTrace) { if (typeof window !== 'undefined') { this.reportIntervalId = window.setInterval( @@ -191,7 +191,7 @@ export class TraceReporter { } }; - private reportHandler = () => { + private readonly reportHandler = () => { if (this.spansCache.length <= 0) { clearInterval(this.reportIntervalId); this.reportIntervalId = undefined; diff --git a/packages/frontend/workspace/src/blob/engine.ts b/packages/frontend/workspace/src/blob/engine.ts index 16f993bda..0c5adb241 100644 --- a/packages/frontend/workspace/src/blob/engine.ts +++ b/packages/frontend/workspace/src/blob/engine.ts @@ -5,8 +5,8 @@ const logger = new DebugLogger('affine:blob-engine'); export class BlobEngine { constructor( - private local: BlobStorage, - private remotes: BlobStorage[] + private readonly local: BlobStorage, + private readonly remotes: BlobStorage[] ) {} get storages() { diff --git a/packages/frontend/workspace/src/providers/storage/affine/batch-sync-sender.ts b/packages/frontend/workspace/src/providers/storage/affine/batch-sync-sender.ts index daebb9bc5..764eea09f 100644 --- a/packages/frontend/workspace/src/providers/storage/affine/batch-sync-sender.ts +++ b/packages/frontend/workspace/src/providers/storage/affine/batch-sync-sender.ts @@ -15,12 +15,12 @@ interface SyncUpdateSender { * - retryable, allow retry when previous sync request failed but with retry flag been set to true */ export class BatchSyncSender { - private buffered: Uint8Array[] = []; + private readonly buffered: Uint8Array[] = []; private job: Promise | null = null; private started = true; constructor( - private guid: string, + private readonly guid: string, private readonly rawSender: SyncUpdateSender ) {} diff --git a/packages/frontend/workspace/src/providers/sync/engine.ts b/packages/frontend/workspace/src/providers/sync/engine.ts index 85221587d..fca3e2c74 100644 --- a/packages/frontend/workspace/src/providers/sync/engine.ts +++ b/packages/frontend/workspace/src/providers/sync/engine.ts @@ -63,9 +63,9 @@ export class SyncEngine { private abort = new AbortController(); constructor( - private rootDoc: Doc, - private local: Storage, - private remotes: Storage[] + private readonly rootDoc: Doc, + private readonly local: Storage, + private readonly remotes: Storage[] ) { this._status = { step: SyncEngineStep.Stopped, diff --git a/packages/frontend/workspace/src/providers/sync/peer.ts b/packages/frontend/workspace/src/providers/sync/peer.ts index a0c270e80..5597bb846 100644 --- a/packages/frontend/workspace/src/providers/sync/peer.ts +++ b/packages/frontend/workspace/src/providers/sync/peer.ts @@ -69,8 +69,8 @@ export class SyncPeer { logger = new DebugLogger('affine:sync-peer:' + this.name); constructor( - private rootDoc: Doc, - private storage: Storage + private readonly rootDoc: Doc, + private readonly storage: Storage ) { this.logger.debug('peer start'); @@ -150,7 +150,7 @@ export class SyncPeer { } } - private state: { + private readonly state: { connectedDocs: Map; pushUpdatesQueue: AsyncQueue<{ docId: string;