0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-02-01 20:25:12 -05:00

fix(cli): allow root modules be .mjs/.cjs (#8310)

Fixes #6176
This commit is contained in:
Kitson Kelly 2020-11-10 10:10:41 +11:00 committed by GitHub
parent 568b7d6afb
commit c1fa8fbeba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 90 additions and 11 deletions

View file

@ -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,

View file

@ -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")

View file

@ -0,0 +1,3 @@
import * as b from "./b.ts";
console.log(b);

View file

@ -0,0 +1 @@
export const b = "b";

View file

@ -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;