From 1dd5396589ea9eca1cf3b33e15760aa83b68b34a Mon Sep 17 00:00:00 2001 From: Cameron Clark Date: Wed, 3 Dec 2025 22:49:24 +0000 Subject: [PATCH 1/2] fix(linter): fix VisitorObject type to allow specific typed methods with index signature Use intersection type instead of interface to avoid TypeScript strict mode errors when using defineRule with specific visitor methods like Program(). Closes #14745 --- apps/oxlint/src-js/generated/visitor.d.ts | 7 +++++-- tasks/ast_tools/src/generators/estree_visit.rs | 8 ++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/oxlint/src-js/generated/visitor.d.ts b/apps/oxlint/src-js/generated/visitor.d.ts index 4e41e2761d80c..9c70eaf221c6e 100644 --- a/apps/oxlint/src-js/generated/visitor.d.ts +++ b/apps/oxlint/src-js/generated/visitor.d.ts @@ -3,7 +3,7 @@ import type * as ESTree from "./types.d.ts"; -export interface VisitorObject { +type VisitorObjectBase = { DebuggerStatement?: (node: ESTree.DebuggerStatement) => void; "DebuggerStatement:exit"?: (node: ESTree.DebuggerStatement) => void; EmptyStatement?: (node: ESTree.EmptyStatement) => void; @@ -384,5 +384,8 @@ export interface VisitorObject { "TSTypeReference:exit"?: (node: ESTree.TSTypeReference) => void; TSUnionType?: (node: ESTree.TSUnionType) => void; "TSUnionType:exit"?: (node: ESTree.TSUnionType) => void; +}; + +export type VisitorObject = VisitorObjectBase & { [key: string]: (node: ESTree.Node) => void; -} +}; diff --git a/tasks/ast_tools/src/generators/estree_visit.rs b/tasks/ast_tools/src/generators/estree_visit.rs index 67e60e180c70a..55d3376b8a6c9 100644 --- a/tasks/ast_tools/src/generators/estree_visit.rs +++ b/tasks/ast_tools/src/generators/estree_visit.rs @@ -438,8 +438,12 @@ fn generate(codegen: &Codegen) -> Codes { let visitor_type_oxlint = format!(" import type * as ESTree from './types.d.ts'; - export interface VisitorObject {{ - {visitor_type} [key: string]: (node: ESTree.Node) => void; + type VisitorObjectBase = {{ + {visitor_type} + }}; + + export type VisitorObject = VisitorObjectBase & {{ + [key: string]: (node: ESTree.Node) => void; }} "); From 1d2b03dc4b22acf68043e2a18ec8f68c3ba88229 Mon Sep 17 00:00:00 2001 From: Cameron Clark Date: Wed, 3 Dec 2025 22:51:08 +0000 Subject: [PATCH 2/2] refactor(linter): rename visitor.d.ts to visitor.ts Rename from declaration file to regular TypeScript file since it only contains type exports and is not accompanying a JavaScript file. Closes #14745 --- .github/generated/ast_changes_watch_list.yml | 2 +- apps/oxlint/src-js/generated/{visitor.d.ts => visitor.ts} | 0 apps/oxlint/src-js/plugins/types.ts | 2 +- tasks/ast_tools/src/generators/estree_visit.rs | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename apps/oxlint/src-js/generated/{visitor.d.ts => visitor.ts} (100%) diff --git a/.github/generated/ast_changes_watch_list.yml b/.github/generated/ast_changes_watch_list.yml index 1313d008aefc5..b1b0d539bb7f2 100644 --- a/.github/generated/ast_changes_watch_list.yml +++ b/.github/generated/ast_changes_watch_list.yml @@ -9,7 +9,7 @@ src: - 'apps/oxlint/src-js/generated/keys.ts' - 'apps/oxlint/src-js/generated/type_ids.ts' - 'apps/oxlint/src-js/generated/types.d.ts' - - 'apps/oxlint/src-js/generated/visitor.d.ts' + - 'apps/oxlint/src-js/generated/visitor.ts' - 'apps/oxlint/src-js/generated/walk.js' - 'apps/oxlint/src/generated/raw_transfer_constants.rs' - 'crates/oxc_allocator/src/**' diff --git a/apps/oxlint/src-js/generated/visitor.d.ts b/apps/oxlint/src-js/generated/visitor.ts similarity index 100% rename from apps/oxlint/src-js/generated/visitor.d.ts rename to apps/oxlint/src-js/generated/visitor.ts diff --git a/apps/oxlint/src-js/plugins/types.ts b/apps/oxlint/src-js/plugins/types.ts index d1f4abddc0254..6672f92baec8b 100644 --- a/apps/oxlint/src-js/plugins/types.ts +++ b/apps/oxlint/src-js/plugins/types.ts @@ -9,7 +9,7 @@ export interface Visitor { import type { Span } from "./location.ts"; import type { Token, CommentToken } from "./tokens.ts"; -import type { VisitorObject as Visitor } from "../generated/visitor.d.ts"; +import type { VisitorObject as Visitor } from "../generated/visitor.ts"; export type { Visitor }; // Hook function that runs before traversal. diff --git a/tasks/ast_tools/src/generators/estree_visit.rs b/tasks/ast_tools/src/generators/estree_visit.rs index 55d3376b8a6c9..94f6e3fcbf5ed 100644 --- a/tasks/ast_tools/src/generators/estree_visit.rs +++ b/tasks/ast_tools/src/generators/estree_visit.rs @@ -85,7 +85,7 @@ impl Generator for ESTreeVisitGenerator { code: type_ids_map_oxlint, }, Output::Javascript { - path: format!("{OXLINT_APP_PATH}/src-js/generated/visitor.d.ts"), + path: format!("{OXLINT_APP_PATH}/src-js/generated/visitor.ts"), code: visitor_type_oxlint, }, ]