diff options
Diffstat (limited to 'cli/global_state.rs')
-rw-r--r-- | cli/global_state.rs | 89 |
1 files changed, 80 insertions, 9 deletions
diff --git a/cli/global_state.rs b/cli/global_state.rs index 3c3348fd1..c1ed3af61 100644 --- a/cli/global_state.rs +++ b/cli/global_state.rs @@ -5,8 +5,10 @@ use crate::flags; use crate::http_cache; use crate::import_map::ImportMap; use crate::lockfile::Lockfile; +use crate::module_graph::ModuleGraphFile; use crate::module_graph::ModuleGraphLoader; use crate::msg; +use crate::msg::MediaType; use crate::permissions::Permissions; use crate::state::exit_unstable; use crate::tsc::CompiledModule; @@ -140,16 +142,14 @@ impl GlobalState { .fetch_cached_source_file(&module_specifier, permissions.clone()) .expect("Source file not found"); - // Check if we need to compile files - let needs_compilation = match out.media_type { - msg::MediaType::TypeScript - | msg::MediaType::TSX - | msg::MediaType::JSX => true, - msg::MediaType::JavaScript => self.ts_compiler.compile_js, - _ => false, - }; + // Check if we need to compile files. + let should_compile = needs_compilation( + self.ts_compiler.compile_js, + out.media_type, + module_graph.values().collect::<Vec<_>>(), + ); - if needs_compilation { + if should_compile { self .ts_compiler .compile_module_graph( @@ -241,8 +241,79 @@ impl GlobalState { } } +// Compilation happens if either: +// - `checkJs` is set to true in TS config +// - entry point is a TS file +// - any dependency in module graph is a TS file +fn needs_compilation( + compile_js: bool, + media_type: MediaType, + module_graph_files: Vec<&ModuleGraphFile>, +) -> bool { + let mut needs_compilation = match media_type { + msg::MediaType::TypeScript | msg::MediaType::TSX | msg::MediaType::JSX => { + true + } + msg::MediaType::JavaScript => compile_js, + _ => false, + }; + + needs_compilation |= module_graph_files.iter().any(|module_file| { + let media_type = module_file.media_type; + + media_type == (MediaType::TypeScript as i32) + || media_type == (MediaType::TSX as i32) + || media_type == (MediaType::JSX as i32) + }); + + needs_compilation +} + #[test] fn thread_safe() { fn f<S: Send + Sync>(_: S) {} f(GlobalState::mock(vec![])); } + +#[test] +fn test_needs_compilation() { + assert!(!needs_compilation( + false, + MediaType::JavaScript, + vec![&ModuleGraphFile { + specifier: "some/file.js".to_string(), + url: "file:///some/file.js".to_string(), + redirect: None, + filename: "some/file.js".to_string(), + imports: vec![], + referenced_files: vec![], + lib_directives: vec![], + types_directives: vec![], + type_headers: vec![], + media_type: MediaType::JavaScript as i32, + source_code: "function foo() {}".to_string(), + }] + )); + assert!(!needs_compilation(false, MediaType::JavaScript, vec![])); + assert!(needs_compilation(true, MediaType::JavaScript, vec![])); + assert!(needs_compilation(false, MediaType::TypeScript, vec![])); + assert!(needs_compilation(false, MediaType::JSX, vec![])); + assert!(needs_compilation(false, MediaType::TSX, vec![])); + assert!(needs_compilation( + false, + MediaType::JavaScript, + vec![&ModuleGraphFile { + specifier: "some/file.ts".to_string(), + url: "file:///some/file.ts".to_string(), + redirect: None, + filename: "some/file.ts".to_string(), + imports: vec![], + referenced_files: vec![], + lib_directives: vec![], + types_directives: vec![], + type_headers: vec![], + media_type: MediaType::TypeScript as i32, + source_code: "function foo() {}".to_string(), + }] + )); +} |