summaryrefslogtreecommitdiff
path: root/cli/tsc.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tsc.rs')
-rw-r--r--cli/tsc.rs59
1 files changed, 58 insertions, 1 deletions
diff --git a/cli/tsc.rs b/cli/tsc.rs
index 7f90dd7b2..bcaeaaeb6 100644
--- a/cli/tsc.rs
+++ b/cli/tsc.rs
@@ -22,6 +22,7 @@ use deno_core::Snapshot;
use serde::Deserialize;
use std::cell::RefCell;
use std::collections::HashMap;
+use std::path::PathBuf;
use std::rc::Rc;
/// Provide static assets that are not preloaded in the compiler snapshot.
@@ -63,6 +64,41 @@ fn get_maybe_hash(
}
}
+/// tsc only supports `.ts`, `.tsx`, `.d.ts`, `.js`, or `.jsx` as root modules
+/// and so we have to detect the apparent media type based on extensions it
+/// supports.
+fn get_tsc_media_type(specifier: &ModuleSpecifier) -> MediaType {
+ let url = specifier.as_url();
+ let path = if url.scheme() == "file" {
+ if let Ok(path) = url.to_file_path() {
+ path
+ } else {
+ PathBuf::from(url.path())
+ }
+ } else {
+ PathBuf::from(url.path())
+ };
+ match path.extension() {
+ None => MediaType::Unknown,
+ Some(os_str) => match os_str.to_str() {
+ Some("ts") => {
+ if let Some(os_str) = path.file_stem() {
+ if let Some(file_name) = os_str.to_str() {
+ if file_name.ends_with(".d") {
+ return MediaType::Dts;
+ }
+ }
+ }
+ MediaType::TypeScript
+ }
+ Some("tsx") => MediaType::TSX,
+ Some("js") => MediaType::JavaScript,
+ Some("jsx") => MediaType::JSX,
+ _ => MediaType::Unknown,
+ },
+ }
+}
+
#[derive(Debug, Clone, Default, Eq, PartialEq)]
pub struct EmittedFile {
pub data: String,
@@ -337,7 +373,7 @@ pub fn exec(
.root_names
.iter()
.map(|(s, mt)| {
- let ext_media_type = MediaType::from(&s.as_str().to_owned());
+ let ext_media_type = get_tsc_media_type(s);
if mt != &ext_media_type {
let new_specifier = format!("{}{}", s, mt.as_ts_extension());
root_map.insert(new_specifier.clone(), s.clone());
@@ -490,6 +526,27 @@ mod tests {
);
}
+ #[test]
+ fn test_get_tsc_media_type() {
+ let fixtures = vec![
+ ("file:///a.ts", MediaType::TypeScript),
+ ("file:///a.tsx", MediaType::TSX),
+ ("file:///a.d.ts", MediaType::Dts),
+ ("file:///a.js", MediaType::JavaScript),
+ ("file:///a.jsx", MediaType::JSX),
+ ("file:///a.cjs", MediaType::Unknown),
+ ("file:///a.mjs", MediaType::Unknown),
+ ("file:///a.json", MediaType::Unknown),
+ ("file:///a.wasm", MediaType::Unknown),
+ ("file:///a.js.map", MediaType::Unknown),
+ ("file:///.tsbuildinfo", MediaType::Unknown),
+ ];
+ for (specifier, media_type) in fixtures {
+ let specifier = ModuleSpecifier::resolve_url_or_path(specifier).unwrap();
+ assert_eq!(get_tsc_media_type(&specifier), media_type);
+ }
+ }
+
#[tokio::test]
async fn test_emit() {
let mut state = setup(None, None, None).await;