diff --git a/crates/oxc_transformer/src/lib.rs b/crates/oxc_transformer/src/lib.rs index cc6426bbc2557..0a05975a2f7fe 100644 --- a/crates/oxc_transformer/src/lib.rs +++ b/crates/oxc_transformer/src/lib.rs @@ -37,7 +37,7 @@ pub use crate::{ es2015::{ArrowFunctionsOptions, ES2015Options}, options::BabelOptions, options::TransformOptions, - react::ReactOptions, + react::{ReactJsxRuntime, ReactOptions}, typescript::TypeScriptOptions, }; diff --git a/crates/oxc_transformer/src/react/mod.rs b/crates/oxc_transformer/src/react/mod.rs index abfe4059dd4bd..3c3ff6324db51 100644 --- a/crates/oxc_transformer/src/react/mod.rs +++ b/crates/oxc_transformer/src/react/mod.rs @@ -12,7 +12,11 @@ use oxc_traverse::TraverseCtx; use crate::context::Ctx; -pub use self::{display_name::ReactDisplayName, jsx::ReactJsx, options::ReactOptions}; +pub use self::{ + display_name::ReactDisplayName, + jsx::ReactJsx, + options::{ReactJsxRuntime, ReactOptions}, +}; /// [Preset React](https://babel.dev/docs/babel-preset-react) /// diff --git a/tasks/coverage/src/transformer.rs b/tasks/coverage/src/transformer.rs index b9fb4c19dc4cc..d3980b66486a9 100644 --- a/tasks/coverage/src/transformer.rs +++ b/tasks/coverage/src/transformer.rs @@ -5,8 +5,8 @@ use oxc_codegen::{Codegen, CodegenOptions}; use oxc_parser::Parser; use oxc_span::SourceType; use oxc_transformer::{ - ArrowFunctionsOptions, ES2015Options, ReactOptions, TransformOptions, Transformer, - TypeScriptOptions, + ArrowFunctionsOptions, ES2015Options, ReactJsxRuntime, ReactOptions, TransformOptions, + Transformer, TypeScriptOptions, }; use crate::{ @@ -17,11 +17,8 @@ use crate::{ typescript::TypeScriptCase, }; -/// Runs the transformer and make sure it doesn't crash. -fn get_result(source_text: &str, source_type: SourceType, source_path: &Path) -> TestResult { - let allocator = Allocator::default(); - let filename = source_path.file_name().unwrap().to_string_lossy(); - let options = TransformOptions { +fn get_default_transformer_options() -> TransformOptions { + TransformOptions { typescript: TypeScriptOptions::default(), es2015: ES2015Options { arrow_function: Some(ArrowFunctionsOptions::default()) }, react: ReactOptions { @@ -31,7 +28,19 @@ fn get_result(source_text: &str, source_type: SourceType, source_path: &Path) -> ..Default::default() }, ..Default::default() - }; + } +} + +/// Runs the transformer and make sure it doesn't crash. +fn get_result( + source_text: &str, + source_type: SourceType, + source_path: &Path, + options: Option, +) -> TestResult { + let allocator = Allocator::default(); + let filename = source_path.file_name().unwrap().to_string_lossy(); + let options = options.unwrap_or_else(get_default_transformer_options); let parse_result1 = Parser::new(&allocator, source_text, source_type).parse(); let mut program = parse_result1.program; let _ = Transformer::new( @@ -105,7 +114,7 @@ impl Case for TransformerTest262Case { let source_text = self.base.code(); let is_module = self.base.meta().flags.contains(&TestFlag::Module); let source_type = SourceType::default().with_module(is_module); - let result = get_result(source_text, source_type, self.path()); + let result = get_result(source_text, source_type, self.path(), None); self.base.set_result(result); } } @@ -138,7 +147,7 @@ impl Case for TransformerBabelCase { fn run(&mut self) { let source_text = self.base.code(); let source_type = self.base.source_type(); - let result = get_result(source_text, source_type, self.path()); + let result = get_result(source_text, source_type, self.path(), None); self.base.set_result(result); } } @@ -169,7 +178,14 @@ impl Case for TransformerTypeScriptCase { } fn run(&mut self) { - let result = get_result(self.base.code(), self.base.source_type(), self.path()); + let mut options = get_default_transformer_options(); + let mut source_type = self.base.source_type(); + // handle @jsx: react, `react` of behavior is match babel following options + if self.base.meta().options.jsx.last().is_some_and(|jsx| jsx == "react") { + source_type = source_type.with_module(true); + options.react.runtime = ReactJsxRuntime::Classic; + } + let result = get_result(self.base.code(), source_type, self.path(), Some(options)); self.base.set_result(result); } } @@ -200,7 +216,7 @@ impl Case for TransformerMiscCase { } fn run(&mut self) { - let result = get_result(self.base.code(), self.base.source_type(), self.path()); + let result = get_result(self.base.code(), self.base.source_type(), self.path(), None); self.base.set_result(result); } } diff --git a/tasks/coverage/src/typescript.rs b/tasks/coverage/src/typescript.rs index 37811f4376d79..2a95ee7e757a3 100644 --- a/tasks/coverage/src/typescript.rs +++ b/tasks/coverage/src/typescript.rs @@ -81,6 +81,10 @@ impl TypeScriptCase { pub fn set_result(&mut self, result: TestResult) { self.result = result; } + + pub fn meta(&self) -> &TypeScriptTestMeta { + &self.meta + } } impl Case for TypeScriptCase { @@ -133,8 +137,8 @@ impl Case for TypeScriptCase { } } -struct TypeScriptTestMeta { - pub tests: Vec, +pub struct TypeScriptTestMeta { + pub(self) tests: Vec, pub options: CompilerOptions, error_files: Vec, } @@ -224,7 +228,7 @@ struct TestUnitData { #[derive(Debug)] #[allow(unused)] -struct CompilerOptions { +pub struct CompilerOptions { pub modules: Vec, pub targets: Vec, pub strict: bool, diff --git a/tasks/coverage/transformer_typescript.snap b/tasks/coverage/transformer_typescript.snap index bfa4a8b9416b3..9f5bf8551c3bf 100644 --- a/tasks/coverage/transformer_typescript.snap +++ b/tasks/coverage/transformer_typescript.snap @@ -2,7 +2,5 @@ commit: 64d2eeea transformer_typescript Summary: AST Parsed : 5243/5243 (100.00%) -Positive Passed: 5240/5243 (99.94%) +Positive Passed: 5242/5243 (99.98%) Mismatch: "compiler/elidedEmbeddedStatementsReplacedWithSemicolon.ts" -Mismatch: "compiler/jsxComplexSignatureHasApplicabilityError.tsx" -Mismatch: "compiler/tsxReactPropsInferenceSucceedsOnIntersections.tsx"