Skip to content

Commit

Permalink
fix(cli): handle local files with query params on emit (denoland#13568)
Browse files Browse the repository at this point in the history
  • Loading branch information
kitsonk committed Feb 2, 2022
1 parent 975e55d commit de5a4a1
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 34 deletions.
5 changes: 5 additions & 0 deletions cli/tests/integration/run_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2453,6 +2453,11 @@ fn issue12807() {
assert!(status.success());
}

itest!(issue_13562 {
args: "run issue13562.ts",
output: "issue13562.ts.out",
});

itest!(import_assertions_static_import {
args: "run --allow-read import_assertions/static_import.ts",
output: "import_assertions/static_import.out",
Expand Down
3 changes: 3 additions & 0 deletions cli/tests/testdata/issue13562.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { printHello3 } from "./subdir/mod1.ts?q=.json";

printHello3();
2 changes: 2 additions & 0 deletions cli/tests/testdata/issue13562.ts.out
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[WILDCARD]
Hello
115 changes: 81 additions & 34 deletions cli/tsc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -349,32 +349,48 @@ struct EmitArgs {
maybe_specifiers: Option<Vec<String>>,
}

fn op_emit(state: &mut State, args: Value) -> Result<Value, AnyError> {
let v: EmitArgs = serde_json::from_value(args)
.context("Invalid request from JavaScript for \"op_emit\".")?;
match v.file_name.as_ref() {
"deno:https:///.tsbuildinfo" => state.maybe_tsbuildinfo = Some(v.data),
_ => state.emitted_files.push(EmittedFile {
data: v.data,
maybe_specifiers: if let Some(specifiers) = &v.maybe_specifiers {
let specifiers = specifiers
.iter()
.map(|s| {
if let Some(data_specifier) = state.remapped_specifiers.get(s) {
data_specifier.clone()
} else if let Some(remapped_specifier) = state.root_map.get(s) {
remapped_specifier.clone()
} else {
normalize_specifier(s).unwrap()
}
})
.collect();
Some(specifiers)
fn op_emit(state: &mut State, args: EmitArgs) -> Result<Value, AnyError> {
match args.file_name.as_ref() {
"deno:https:///.tsbuildinfo" => state.maybe_tsbuildinfo = Some(args.data),
_ => {
let media_type = MediaType::from(&args.file_name);
let media_type = if matches!(
media_type,
MediaType::JavaScript
| MediaType::Mjs
| MediaType::Cjs
| MediaType::Dts
| MediaType::Dmts
| MediaType::Dcts
| MediaType::SourceMap
| MediaType::TsBuildInfo
) {
media_type
} else {
None
},
media_type: MediaType::from(&v.file_name),
}),
MediaType::JavaScript
};
state.emitted_files.push(EmittedFile {
data: args.data,
maybe_specifiers: if let Some(specifiers) = &args.maybe_specifiers {
let specifiers = specifiers
.iter()
.map(|s| {
if let Some(data_specifier) = state.remapped_specifiers.get(s) {
data_specifier.clone()
} else if let Some(remapped_specifier) = state.root_map.get(s) {
remapped_specifier.clone()
} else {
normalize_specifier(s).unwrap()
}
})
.collect();
Some(specifiers)
} else {
None
},
media_type,
})
}
}

Ok(json!(true))
Expand Down Expand Up @@ -883,11 +899,11 @@ mod tests {
let mut state = setup(None, None, None).await;
let actual = op_emit(
&mut state,
json!({
"data": "some file content",
"fileName": "cache:https:///some/file.js",
"maybeSpecifiers": ["file:https:///some/file.ts"]
}),
EmitArgs {
data: "some file content".to_string(),
file_name: "cache:https:///some/file.js".to_string(),
maybe_specifiers: Some(vec!["file:https:///some/file.ts".to_string()]),
},
)
.expect("should have invoked op");
assert_eq!(actual, json!(true));
Expand All @@ -906,15 +922,46 @@ mod tests {
);
}

#[tokio::test]
async fn test_emit_strange_specifier() {
let mut state = setup(None, None, None).await;
let actual = op_emit(
&mut state,
EmitArgs {
data: "some file content".to_string(),
file_name: "deno:https:///some.file.ts?q=.json".to_string(),
maybe_specifiers: Some(
vec!["file:https:///some/file.ts?q=.json".to_string()],
),
},
)
.expect("should have invoked op");
assert_eq!(actual, json!(true));
assert_eq!(state.emitted_files.len(), 1);
assert!(state.maybe_tsbuildinfo.is_none());
assert_eq!(
state.emitted_files[0],
EmittedFile {
data: "some file content".to_string(),
maybe_specifiers: Some(vec![resolve_url_or_path(
"file:https:///some/file.ts?q=.json"
)
.unwrap()]),
media_type: MediaType::JavaScript,
}
);
}

#[tokio::test]
async fn test_emit_tsbuildinfo() {
let mut state = setup(None, None, None).await;
let actual = op_emit(
&mut state,
json!({
"data": "some file content",
"fileName": "deno:https:///.tsbuildinfo",
}),
EmitArgs {
data: "some file content".to_string(),
file_name: "deno:https:///.tsbuildinfo".to_string(),
maybe_specifiers: None,
},
)
.expect("should have invoked op");
assert_eq!(actual, json!(true));
Expand Down

0 comments on commit de5a4a1

Please sign in to comment.