summaryrefslogtreecommitdiff
path: root/cli/msg.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/msg.rs')
-rw-r--r--cli/msg.rs125
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);
+ }
+}