diff --git a/crates/oxc_ast/src/ast/js.rs b/crates/oxc_ast/src/ast/js.rs index 1fd4398ee..d4abb3169 100644 --- a/crates/oxc_ast/src/ast/js.rs +++ b/crates/oxc_ast/src/ast/js.rs @@ -1110,6 +1110,18 @@ impl<'a> Declaration<'a> { _ => true, } } + pub fn modifiers(&self) -> Option<&Modifiers<'a>> { + match self { + Declaration::VariableDeclaration(decl) => Some(&decl.modifiers), + Declaration::FunctionDeclaration(decl) => Some(&decl.modifiers), + Declaration::ClassDeclaration(decl) => Some(&decl.modifiers), + Declaration::TSEnumDeclaration(decl) => Some(&decl.modifiers), + Declaration::TSTypeAliasDeclaration(decl) => Some(&decl.modifiers), + Declaration::TSModuleDeclaration(decl) => Some(&decl.modifiers), + Declaration::TSInterfaceDeclaration(decl) => Some(&decl.modifiers), + _ => None, + } + } } /// Variable Declaration diff --git a/crates/oxc_transformer/src/typescript/mod.rs b/crates/oxc_transformer/src/typescript/mod.rs index 14f5a6ba2..5d8e8e402 100644 --- a/crates/oxc_transformer/src/typescript/mod.rs +++ b/crates/oxc_transformer/src/typescript/mod.rs @@ -164,7 +164,17 @@ impl<'a> TypeScript<'a> { if decl.export_kind.is_type() || self.verbatim_module_syntax - || (decl.declaration.is_none() && decl.specifiers.is_empty()) + || ((decl.declaration.is_none() + || decl.declaration.as_ref().is_some_and(|d| { + d.modifiers().is_some_and(|modifiers| { + modifiers.contains(ModifierKind::Declare) + }) || matches!( + d, + Declaration::TSInterfaceDeclaration(_) + | Declaration::TSTypeAliasDeclaration(_) + ) + })) + && decl.specifiers.is_empty()) { delete_indexes.push(index); } diff --git a/tasks/transform_conformance/babel.snap.md b/tasks/transform_conformance/babel.snap.md index 293235781..8099a4a57 100644 --- a/tasks/transform_conformance/babel.snap.md +++ b/tasks/transform_conformance/babel.snap.md @@ -1,4 +1,4 @@ -Passed: 308/1179 +Passed: 311/1179 # All Passed: * babel-plugin-transform-numeric-separator @@ -832,7 +832,7 @@ Passed: 308/1179 * general/function-duplicate-name/input.js * general/object/input.js -# babel-plugin-transform-typescript (77/158) +# babel-plugin-transform-typescript (80/158) * class/abstract-class-decorated/input.ts * class/abstract-class-decorated-method/input.ts * class/abstract-class-decorated-parameter/input.ts @@ -848,15 +848,12 @@ Passed: 308/1179 * class/parameter-properties-with-super/input.ts * class/private-method-override-transform-private/input.ts * class/transform-properties-declare-wrong-order/input.ts -* declarations/erased/input.ts -* declarations/export-declare-enum/input.ts * declarations/nested-namespace/input.mjs * exports/declared-types/input.ts * exports/export-const-enums/input.ts * exports/export-type-star-from/input.ts * exports/export=/input.ts * exports/export=-to-cjs/input.ts -* exports/issue-9916-3/input.ts * function/overloads-exports/input.mjs * imports/elide-injected/input.ts * imports/elide-no-import-specifiers/input.ts