From f7baa5bb9d1f874f63d56d11cf864134bea47d1c Mon Sep 17 00:00:00 2001 From: Les Orchard Date: Tue, 15 Sep 2026 16:22:12 -0700 Subject: [PATCH] chore: adopt noImplicitOverride and noFallthroughCasesInSwitch repo-wide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two of the three strict flags WXT 0.21's generated tsconfig introduced. Both are cheap enough to take now, which leaves #688 as a single question about noUncheckedIndexedAccess rather than three tangled ones. Measured cost, deduplicated across packages (cli/server/extension all typecheck core via `paths`, so raw per-package counts double-count): noFallthroughCasesInSwitch 0 sites noImplicitOverride 5 sites, 3 files, all core/src noUncheckedIndexedAccess 55 sites (+145 more in core/test) So this change is the two free ones. The five `override` annotations are genuinely correct documentation, not appeasement — every one is a real override of a base-class member, and events.ts even carried an "Override emit to also trigger wildcard listeners" comment saying so while lacking the keyword. Enabled per package because there is no shared base tsconfig; introducing one is a larger refactor than this warrants. The extension keeps only its noUncheckedIndexedAccess opt-out. Verified both flags actually bite rather than being inert config: removing one `override` keyword produces TS4114, and a deliberate switch fallthrough produces TS7029. Full `pnpm run check` green (typecheck, schema drift, 1600 tests) plus the node 24 release build. Refs #688. --- packages/cli/tsconfig.json | 2 ++ packages/core/src/events.ts | 2 +- packages/core/src/loggers/filter.ts | 4 ++-- packages/core/src/loggers/metricsCollector.ts | 4 ++-- packages/core/tsconfig.json | 2 ++ packages/extension/tsconfig.json | 9 +++------ packages/server/tsconfig.json | 2 ++ 7 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json index 3d28e194..c78de016 100644 --- a/packages/cli/tsconfig.json +++ b/packages/cli/tsconfig.json @@ -23,6 +23,8 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, + "noImplicitOverride": true, + "noFallthroughCasesInSwitch": true, // Interop and compatibility "skipLibCheck": true, diff --git a/packages/core/src/events.ts b/packages/core/src/events.ts index a6744cfa..1d9598c0 100644 --- a/packages/core/src/events.ts +++ b/packages/core/src/events.ts @@ -544,7 +544,7 @@ export class WebAgentEventEmitter extends EventEmitter { /** * Override emit to also trigger wildcard listeners */ - emit(event: string | symbol, ...args: any[]): boolean { + override emit(event: string | symbol, ...args: any[]): boolean { const result = super.emit(event, ...args); // Also emit to wildcard listeners if this isn't already a wildcard event if (event !== "*") { diff --git a/packages/core/src/loggers/filter.ts b/packages/core/src/loggers/filter.ts index 01999d40..87714f1f 100644 --- a/packages/core/src/loggers/filter.ts +++ b/packages/core/src/loggers/filter.ts @@ -15,7 +15,7 @@ export abstract class LoggerFilter extends LoggerWrapper { private filteredEmitter: WebAgentEventEmitter | null = null; private handleEvent: ((eventType: string, data: any) => void) | null = null; - initialize(emitter: WebAgentEventEmitter): void { + override initialize(emitter: WebAgentEventEmitter): void { if (this.emitter) { this.dispose(); } @@ -36,7 +36,7 @@ export abstract class LoggerFilter extends LoggerWrapper { this.wrappedLogger.initialize(this.filteredEmitter); } - dispose(): void { + override dispose(): void { if (this.emitter && this.handleEvent) { this.emitter.off("*", this.handleEvent); this.wrappedLogger.dispose(); diff --git a/packages/core/src/loggers/metricsCollector.ts b/packages/core/src/loggers/metricsCollector.ts index 61f95851..d5500967 100644 --- a/packages/core/src/loggers/metricsCollector.ts +++ b/packages/core/src/loggers/metricsCollector.ts @@ -21,7 +21,7 @@ export class MetricsCollector extends LoggerWrapper { super(wrappedLogger); } - initialize(emitter: WebAgentEventEmitter): void { + override initialize(emitter: WebAgentEventEmitter): void { this.stepCount = 0; this.aiGenerationCount = 0; this.aiGenerationErrorCount = 0; @@ -39,7 +39,7 @@ export class MetricsCollector extends LoggerWrapper { super.initialize(emitter); } - dispose(): void { + override dispose(): void { if (this.emitter) { this.eventCounts.clear(); this.emitter.off("*", this.handleEventCount); diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 924efacc..99a85c0b 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -21,6 +21,8 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, + "noImplicitOverride": true, + "noFallthroughCasesInSwitch": true, // Interop and compatibility "skipLibCheck": true, diff --git a/packages/extension/tsconfig.json b/packages/extension/tsconfig.json index 68387a59..04950e98 100644 --- a/packages/extension/tsconfig.json +++ b/packages/extension/tsconfig.json @@ -5,14 +5,11 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - // WXT 0.21's generated tsconfig enables these; opting out keeps the - // extension typecheck aligned with the rest of the monorepo (it also - // compiles pilo-core sources via the paths aliases below). - // Whether to adopt them monorepo-wide is tracked in + // noImplicitOverride and noFallthroughCasesInSwitch, which WXT 0.21's + // generated tsconfig also enables, are now on repo-wide. Only + // noUncheckedIndexedAccess remains opted out; see // https://github.com/mozilla/pilo/issues/688 "noUncheckedIndexedAccess": false, - "noImplicitOverride": false, - "noFallthroughCasesInSwitch": false, "jsx": "react-jsx", "lib": ["ESNext", "DOM", "WebWorker"], "paths": { diff --git a/packages/server/tsconfig.json b/packages/server/tsconfig.json index 5cee4767..58ed8044 100644 --- a/packages/server/tsconfig.json +++ b/packages/server/tsconfig.json @@ -23,6 +23,8 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, + "noImplicitOverride": true, + "noFallthroughCasesInSwitch": true, // Interop and compatibility "skipLibCheck": true,