mirror of
https://github.com/denoland/deno.git
synced 2025-02-01 20:25:12 -05:00
parent
568b7d6afb
commit
c1fa8fbeba
5 changed files with 90 additions and 11 deletions
|
@ -94,19 +94,16 @@ impl MediaType {
|
|||
},
|
||||
},
|
||||
Some(os_str) => match os_str.to_str() {
|
||||
Some("ts") => match path.file_stem() {
|
||||
Some(os_str) => match os_str.to_str() {
|
||||
Some(file_name) => {
|
||||
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") {
|
||||
MediaType::Dts
|
||||
} else {
|
||||
MediaType::TypeScript
|
||||
return MediaType::Dts;
|
||||
}
|
||||
}
|
||||
None => MediaType::TypeScript,
|
||||
},
|
||||
None => MediaType::TypeScript,
|
||||
},
|
||||
}
|
||||
MediaType::TypeScript
|
||||
}
|
||||
Some("tsx") => MediaType::TSX,
|
||||
Some("js") => MediaType::JavaScript,
|
||||
Some("jsx") => MediaType::JSX,
|
||||
|
|
|
@ -2007,6 +2007,27 @@ pub mod tests {
|
|||
assert_eq!(h.tsbuildinfo_calls.len(), 1);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn fix_graph_check_mjs_root() {
|
||||
let specifier = ModuleSpecifier::resolve_url_or_path("file:///tests/a.mjs")
|
||||
.expect("could not resolve module");
|
||||
let (graph, handler) = setup(specifier).await;
|
||||
let result_info = graph
|
||||
.check(CheckOptions {
|
||||
debug: false,
|
||||
emit: true,
|
||||
lib: TypeLib::DenoWindow,
|
||||
maybe_config_path: None,
|
||||
reload: false,
|
||||
})
|
||||
.expect("should have checked");
|
||||
assert!(result_info.maybe_ignored_options.is_none());
|
||||
assert!(result_info.diagnostics.is_empty());
|
||||
let h = handler.borrow();
|
||||
assert_eq!(h.cache_calls.len(), 1);
|
||||
assert_eq!(h.tsbuildinfo_calls.len(), 1);
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn fix_graph_check_types_root() {
|
||||
let specifier = ModuleSpecifier::resolve_url_or_path("file:///typesref.js")
|
||||
|
|
3
cli/tests/module_graph/file_tests-a.mjs
Normal file
3
cli/tests/module_graph/file_tests-a.mjs
Normal file
|
@ -0,0 +1,3 @@
|
|||
import * as b from "./b.ts";
|
||||
|
||||
console.log(b);
|
1
cli/tests/module_graph/file_tests-b.ts
Normal file
1
cli/tests/module_graph/file_tests-b.ts
Normal file
|
@ -0,0 +1 @@
|
|||
export const b = "b";
|
59
cli/tsc.rs
59
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;
|
||||
|
|
Loading…
Add table
Reference in a new issue