diff options
Diffstat (limited to 'cli/msg.rs')
-rw-r--r-- | cli/msg.rs | 125 |
1 files changed, 114 insertions, 11 deletions
diff --git a/cli/msg.rs b/cli/msg.rs index 3e5000296..520d46fc2 100644 --- a/cli/msg.rs +++ b/cli/msg.rs @@ -1,10 +1,12 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -// Warning! The values in this enum are duplicated in js/compiler.ts -// Update carefully! use serde::Serialize; use serde::Serializer; +use std::path::Path; +use std::path::PathBuf; +// Warning! The values in this enum are duplicated in tsc/99_main_compiler.js +// Update carefully! #[allow(non_camel_case_types)] #[repr(i32)] #[derive(Clone, Copy, PartialEq, Debug)] @@ -12,10 +14,73 @@ pub enum MediaType { JavaScript = 0, JSX = 1, TypeScript = 2, - TSX = 3, - Json = 4, - Wasm = 5, - Unknown = 6, + Dts = 3, + TSX = 4, + Json = 5, + Wasm = 6, + BuildInfo = 7, + Unknown = 8, +} + +impl<'a> From<&'a Path> for MediaType { + fn from(path: &'a Path) -> Self { + MediaType::from_path(path) + } +} + +impl<'a> From<&'a PathBuf> for MediaType { + fn from(path: &'a PathBuf) -> Self { + MediaType::from_path(path) + } +} + +impl<'a> From<&'a String> for MediaType { + fn from(specifier: &'a String) -> Self { + MediaType::from_path(&PathBuf::from(specifier)) + } +} + +impl MediaType { + fn from_path(path: &Path) -> Self { + match path.extension() { + None => MediaType::Unknown, + Some(os_str) => match os_str.to_str() { + Some("ts") => MediaType::TypeScript, + Some("tsx") => MediaType::TSX, + Some("js") => MediaType::JavaScript, + Some("jsx") => MediaType::JSX, + Some("mjs") => MediaType::JavaScript, + Some("cjs") => MediaType::JavaScript, + Some("json") => MediaType::Json, + Some("wasm") => MediaType::Wasm, + _ => MediaType::Unknown, + }, + } + } + + /// Convert a MediaType to a `ts.Extension`. + /// + /// *NOTE* This is defined in TypeScript as a string based enum. Changes to + /// that enum in TypeScript should be reflected here. + pub fn as_ts_extension(&self) -> &str { + match self { + MediaType::JavaScript => ".js", + MediaType::JSX => ".jsx", + MediaType::TypeScript => ".ts", + MediaType::Dts => ".d.ts", + MediaType::TSX => ".tsx", + MediaType::Json => ".json", + // TypeScript doesn't have an "unknown", so we will treat WASM as JS for + // mapping purposes, though in reality, it is unlikely to ever be passed + // to the compiler. + MediaType::Wasm => ".js", + MediaType::BuildInfo => ".tsbuildinfo", + // TypeScript doesn't have an "unknown", so we will treat WASM as JS for + // mapping purposes, though in reality, it is unlikely to ever be passed + // to the compiler. + MediaType::Unknown => ".js", + } + } } impl Serialize for MediaType { @@ -23,14 +88,16 @@ impl Serialize for MediaType { where S: Serializer, { - let value: i32 = match self { + let value = match self { MediaType::JavaScript => 0 as i32, MediaType::JSX => 1 as i32, MediaType::TypeScript => 2 as i32, - MediaType::TSX => 3 as i32, - MediaType::Json => 4 as i32, - MediaType::Wasm => 5 as i32, - MediaType::Unknown => 6 as i32, + MediaType::Dts => 3 as i32, + MediaType::TSX => 4 as i32, + MediaType::Json => 5 as i32, + MediaType::Wasm => 6 as i32, + MediaType::BuildInfo => 7 as i32, + MediaType::Unknown => 8 as i32, }; Serialize::serialize(&value, serializer) } @@ -41,9 +108,11 @@ pub fn enum_name_media_type(mt: MediaType) -> &'static str { MediaType::JavaScript => "JavaScript", MediaType::JSX => "JSX", MediaType::TypeScript => "TypeScript", + MediaType::Dts => "Dts", MediaType::TSX => "TSX", MediaType::Json => "Json", MediaType::Wasm => "Wasm", + MediaType::BuildInfo => "BuildInfo", MediaType::Unknown => "Unknown", } } @@ -76,3 +145,37 @@ impl Serialize for CompilerRequestType { Serialize::serialize(&value, serializer) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_map_file_extension() { + assert_eq!( + MediaType::from(Path::new("foo/bar.ts")), + MediaType::TypeScript + ); + assert_eq!(MediaType::from(Path::new("foo/bar.tsx")), MediaType::TSX); + assert_eq!( + MediaType::from(Path::new("foo/bar.d.ts")), + MediaType::TypeScript + ); + assert_eq!( + MediaType::from(Path::new("foo/bar.js")), + MediaType::JavaScript + ); + assert_eq!(MediaType::from(Path::new("foo/bar.jsx")), MediaType::JSX); + assert_eq!(MediaType::from(Path::new("foo/bar.json")), MediaType::Json); + assert_eq!(MediaType::from(Path::new("foo/bar.wasm")), MediaType::Wasm); + assert_eq!( + MediaType::from(Path::new("foo/bar.cjs")), + MediaType::JavaScript + ); + assert_eq!( + MediaType::from(Path::new("foo/bar.txt")), + MediaType::Unknown + ); + assert_eq!(MediaType::from(Path::new("foo/bar")), MediaType::Unknown); + } +} |