mirror of
https://github.com/danbulant/oxc
synced 2026-05-24 12:21:58 +00:00
fix(transformer): output empty file for TS definition files (#3500)
As discussed in https://github.com/oxc-project/oxc/pull/3489#issuecomment-2143482458, transformer should output an empty file for TS definition files.
This commit is contained in:
parent
98c90291b0
commit
8e4f33557d
5 changed files with 45 additions and 15 deletions
|
|
@ -69,7 +69,14 @@ impl<'a> TypeScript<'a> {
|
||||||
// Transforms
|
// Transforms
|
||||||
impl<'a> TypeScript<'a> {
|
impl<'a> TypeScript<'a> {
|
||||||
pub fn transform_program(&self, program: &mut Program<'a>, ctx: &mut TraverseCtx) {
|
pub fn transform_program(&self, program: &mut Program<'a>, ctx: &mut TraverseCtx) {
|
||||||
self.transform_program_for_namespace(program, ctx);
|
if self.ctx.source_type.is_typescript_definition() {
|
||||||
|
// Output empty file for TS definitions
|
||||||
|
program.directives.clear();
|
||||||
|
program.hashbang = None;
|
||||||
|
program.body.clear();
|
||||||
|
} else {
|
||||||
|
self.transform_program_for_namespace(program, ctx);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn transform_program_on_exit(&self, program: &mut Program<'a>) {
|
pub fn transform_program_on_exit(&self, program: &mut Program<'a>) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
commit: 4bd1b2c2
|
commit: 4bd1b2c2
|
||||||
|
|
||||||
Passed: 2/2
|
Passed: 3/3
|
||||||
|
|
||||||
# All Passed:
|
# All Passed:
|
||||||
* babel-plugin-transform-typescript
|
* babel-plugin-transform-typescript
|
||||||
|
|
|
||||||
|
|
@ -37,9 +37,12 @@ impl TestCaseKind {
|
||||||
return Some(Self::Exec(ExecTestCase::new(cwd, path)));
|
return Some(Self::Exec(ExecTestCase::new(cwd, path)));
|
||||||
}
|
}
|
||||||
|
|
||||||
// named `input.[ext]``
|
// named `input.[ext]` or `input.d.ts`
|
||||||
if path.file_stem().is_some_and(|name| name == "input")
|
if (path.file_stem().is_some_and(|name| name == "input")
|
||||||
&& path.extension().is_some_and(|ext| VALID_EXTENSIONS.contains(&ext.to_str().unwrap()))
|
&& path
|
||||||
|
.extension()
|
||||||
|
.is_some_and(|ext| VALID_EXTENSIONS.contains(&ext.to_str().unwrap())))
|
||||||
|
|| path.file_name().is_some_and(|name| name == "input.d.ts")
|
||||||
{
|
{
|
||||||
return Some(Self::Transform(ConformanceTestCase::new(cwd, path)));
|
return Some(Self::Transform(ConformanceTestCase::new(cwd, path)));
|
||||||
}
|
}
|
||||||
|
|
@ -156,11 +159,15 @@ pub trait TestCase {
|
||||||
let allocator = Allocator::default();
|
let allocator = Allocator::default();
|
||||||
let source_text = fs::read_to_string(path).unwrap();
|
let source_text = fs::read_to_string(path).unwrap();
|
||||||
|
|
||||||
let source_type = SourceType::from_path(path).unwrap().with_typescript(
|
// Some babel test cases have a js extension, but contain typescript code.
|
||||||
// Some babel test cases have a js extension, but contain typescript code.
|
// Therefore, if the typescript plugin exists, enable typescript.
|
||||||
// Therefore, if the typescript plugin exists, enable the typescript.
|
let mut source_type = SourceType::from_path(path).unwrap();
|
||||||
self.options().get_plugin("transform-typescript").is_some(),
|
if !source_type.is_typescript()
|
||||||
);
|
&& (self.options().get_plugin("transform-typescript").is_some()
|
||||||
|
|| self.options().get_plugin("syntax-typescript").is_some())
|
||||||
|
{
|
||||||
|
source_type = source_type.with_typescript(true);
|
||||||
|
}
|
||||||
|
|
||||||
let ret = Parser::new(&allocator, &source_text, source_type).parse();
|
let ret = Parser::new(&allocator, &source_text, source_type).parse();
|
||||||
let mut program = ret.program;
|
let mut program = ret.program;
|
||||||
|
|
@ -224,18 +231,20 @@ impl TestCase for ConformanceTestCase {
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.is_some_and(|path| path.extension().and_then(std::ffi::OsStr::to_str) == Some("js"));
|
.is_some_and(|path| path.extension().and_then(std::ffi::OsStr::to_str) == Some("js"));
|
||||||
|
|
||||||
let source_type = SourceType::from_path(&self.path)
|
let mut source_type = SourceType::from_path(&self.path)
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.with_script(if self.options.source_type.is_some() {
|
.with_script(if self.options.source_type.is_some() {
|
||||||
!self.options.is_module()
|
!self.options.is_module()
|
||||||
} else {
|
} else {
|
||||||
input_is_js && output_is_js
|
input_is_js && output_is_js
|
||||||
})
|
})
|
||||||
.with_typescript(
|
|
||||||
self.options.get_plugin("transform-typescript").is_some()
|
|
||||||
|| self.options.get_plugin("syntax-typescript").is_some(),
|
|
||||||
)
|
|
||||||
.with_jsx(self.options.get_plugin("syntax-jsx").is_some());
|
.with_jsx(self.options.get_plugin("syntax-jsx").is_some());
|
||||||
|
if !source_type.is_typescript()
|
||||||
|
&& (self.options.get_plugin("transform-typescript").is_some()
|
||||||
|
|| self.options.get_plugin("syntax-typescript").is_some())
|
||||||
|
{
|
||||||
|
source_type = source_type.with_typescript(true);
|
||||||
|
}
|
||||||
|
|
||||||
if filtered {
|
if filtered {
|
||||||
println!("input_path: {:?}", &self.path);
|
println!("input_path: {:?}", &self.path);
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
export interface Things<P, T> {
|
||||||
|
p: P;
|
||||||
|
t: T;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Props {
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class MyComponent {
|
||||||
|
props: Props;
|
||||||
|
}
|
||||||
|
export namespace Something {
|
||||||
|
export const foo = 123;
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue