mirror of
https://github.com/denoland/deno.git
synced 2024-12-23 07:44:48 -05:00
fix: Omit buildinfo when --reload passed (#6489)
This commit is contained in:
parent
4817c153e4
commit
70463bac7d
2 changed files with 93 additions and 47 deletions
|
@ -610,6 +610,37 @@ fn ts_dependency_recompilation() {
|
||||||
assert!(stdout_output.is_empty());
|
assert!(stdout_output.is_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn ts_reload() {
|
||||||
|
let hello_ts = util::root_path().join("cli/tests/002_hello.ts");
|
||||||
|
assert!(hello_ts.is_file());
|
||||||
|
let mut initial = util::deno_cmd()
|
||||||
|
.current_dir(util::root_path())
|
||||||
|
.arg("cache")
|
||||||
|
.arg("--reload")
|
||||||
|
.arg(hello_ts.clone())
|
||||||
|
.spawn()
|
||||||
|
.expect("failed to spawn script");
|
||||||
|
let status_initial =
|
||||||
|
initial.wait().expect("failed to wait for child process");
|
||||||
|
assert!(status_initial.success());
|
||||||
|
|
||||||
|
let output = util::deno_cmd()
|
||||||
|
.current_dir(util::root_path())
|
||||||
|
.arg("cache")
|
||||||
|
.arg("--reload")
|
||||||
|
.arg("-L")
|
||||||
|
.arg("debug")
|
||||||
|
.arg(hello_ts)
|
||||||
|
.output()
|
||||||
|
.expect("failed to spawn script");
|
||||||
|
// check the output of the the bundle program.
|
||||||
|
assert!(std::str::from_utf8(&output.stdout)
|
||||||
|
.unwrap()
|
||||||
|
.trim()
|
||||||
|
.contains("compiler::host.writeFile deno://002_hello.js"));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn bundle_exports() {
|
fn bundle_exports() {
|
||||||
// First we have to generate a bundle of some module that has exports.
|
// First we have to generate a bundle of some module that has exports.
|
||||||
|
|
109
cli/tsc.rs
109
cli/tsc.rs
|
@ -422,8 +422,8 @@ impl TsCompiler {
|
||||||
c.contains(url)
|
c.contains(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Check if there is compiled source in cache that is valid
|
/// Check if there is compiled source in cache that is valid and can be used
|
||||||
/// and can be used again.
|
/// again.
|
||||||
fn has_compiled_source(
|
fn has_compiled_source(
|
||||||
&self,
|
&self,
|
||||||
file_fetcher: &SourceFileFetcher,
|
file_fetcher: &SourceFileFetcher,
|
||||||
|
@ -450,6 +450,55 @@ impl TsCompiler {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn has_valid_cache(
|
||||||
|
&self,
|
||||||
|
file_fetcher: &SourceFileFetcher,
|
||||||
|
url: &Url,
|
||||||
|
build_info: &Option<String>,
|
||||||
|
) -> Result<bool, ErrBox> {
|
||||||
|
if let Some(build_info_str) = build_info.as_ref() {
|
||||||
|
let build_inf_json: Value = serde_json::from_str(build_info_str)?;
|
||||||
|
let program_val = build_inf_json["program"].as_object().unwrap();
|
||||||
|
let file_infos = program_val["fileInfos"].as_object().unwrap();
|
||||||
|
|
||||||
|
if !self.has_compiled_source(file_fetcher, url) {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (filename, file_info) in file_infos.iter() {
|
||||||
|
if filename.starts_with("asset://") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let url = Url::parse(&filename).expect("Filename is not a valid url");
|
||||||
|
let specifier = ModuleSpecifier::from(url);
|
||||||
|
|
||||||
|
if let Some(source_file) = file_fetcher
|
||||||
|
.fetch_cached_source_file(&specifier, Permissions::allow_all())
|
||||||
|
{
|
||||||
|
let existing_hash = crate::checksum::gen(vec![
|
||||||
|
&source_file.source_code,
|
||||||
|
version::DENO.as_bytes(),
|
||||||
|
]);
|
||||||
|
let expected_hash =
|
||||||
|
file_info["version"].as_str().unwrap().to_string();
|
||||||
|
if existing_hash != expected_hash {
|
||||||
|
// hashes don't match, somethings changed
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no cached source file
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// no build info
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
||||||
/// Asynchronously compile module and all it's dependencies.
|
/// Asynchronously compile module and all it's dependencies.
|
||||||
///
|
///
|
||||||
/// This method compiled every module at most once.
|
/// This method compiled every module at most once.
|
||||||
|
@ -468,58 +517,24 @@ impl TsCompiler {
|
||||||
module_graph: ModuleGraph,
|
module_graph: ModuleGraph,
|
||||||
allow_js: bool,
|
allow_js: bool,
|
||||||
) -> Result<(), ErrBox> {
|
) -> Result<(), ErrBox> {
|
||||||
let mut has_cached_version = false;
|
|
||||||
|
|
||||||
let module_url = source_file.url.clone();
|
let module_url = source_file.url.clone();
|
||||||
let build_info_key = self
|
let build_info_key = self
|
||||||
.disk_cache
|
.disk_cache
|
||||||
.get_cache_filename_with_extension(&module_url, "buildinfo");
|
.get_cache_filename_with_extension(&module_url, "buildinfo");
|
||||||
|
|
||||||
let build_info = match self.disk_cache.get(&build_info_key) {
|
let build_info = match self.disk_cache.get(&build_info_key) {
|
||||||
Ok(bytes) => Some(String::from_utf8(bytes)?),
|
Ok(bytes) => Some(String::from_utf8(bytes)?),
|
||||||
Err(_) => None,
|
Err(_) => None,
|
||||||
};
|
};
|
||||||
|
|
||||||
let file_fetcher = global_state.file_fetcher.clone();
|
// Only use disk cache if `--reload` flag was not used or this file has
|
||||||
|
// already been compiled during current process lifetime.
|
||||||
// Only use disk cache if `--reload` flag was not used or
|
if (self.use_disk_cache || self.has_compiled(&source_file.url))
|
||||||
// this file has already been compiled during current process
|
&& self.has_valid_cache(
|
||||||
// lifetime.
|
&global_state.file_fetcher,
|
||||||
if self.use_disk_cache || self.has_compiled(&source_file.url) {
|
&source_file.url,
|
||||||
if let Some(build_info_str) = build_info.as_ref() {
|
&build_info,
|
||||||
let build_inf_json: Value = serde_json::from_str(build_info_str)?;
|
)?
|
||||||
let program_val = build_inf_json["program"].as_object().unwrap();
|
{
|
||||||
let file_infos = program_val["fileInfos"].as_object().unwrap();
|
|
||||||
|
|
||||||
has_cached_version = true;
|
|
||||||
|
|
||||||
has_cached_version &= self
|
|
||||||
.has_compiled_source(&global_state.file_fetcher, &source_file.url);
|
|
||||||
|
|
||||||
for (filename, file_info) in file_infos.iter() {
|
|
||||||
if filename.starts_with("asset://") {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let url = Url::parse(&filename).expect("Filename is not a valid url");
|
|
||||||
let specifier = ModuleSpecifier::from(url);
|
|
||||||
if let Some(source_file) = file_fetcher
|
|
||||||
.fetch_cached_source_file(&specifier, Permissions::allow_all())
|
|
||||||
{
|
|
||||||
let existing_hash = crate::checksum::gen(vec![
|
|
||||||
&source_file.source_code,
|
|
||||||
version::DENO.as_bytes(),
|
|
||||||
]);
|
|
||||||
let expected_hash =
|
|
||||||
file_info["version"].as_str().unwrap().to_string();
|
|
||||||
has_cached_version &= existing_hash == expected_hash
|
|
||||||
} else {
|
|
||||||
has_cached_version &= false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if has_cached_version {
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,7 +565,7 @@ impl TsCompiler {
|
||||||
"config": str::from_utf8(&config_data).unwrap(),
|
"config": str::from_utf8(&config_data).unwrap(),
|
||||||
"cwd": cwd,
|
"cwd": cwd,
|
||||||
"sourceFileMap": module_graph_json,
|
"sourceFileMap": module_graph_json,
|
||||||
"buildInfo": build_info,
|
"buildInfo": if self.use_disk_cache { build_info } else { None },
|
||||||
}),
|
}),
|
||||||
_ => json!({
|
_ => json!({
|
||||||
"type": msg::CompilerRequestType::Compile,
|
"type": msg::CompilerRequestType::Compile,
|
||||||
|
@ -561,7 +576,7 @@ impl TsCompiler {
|
||||||
"performance": performance,
|
"performance": performance,
|
||||||
"cwd": cwd,
|
"cwd": cwd,
|
||||||
"sourceFileMap": module_graph_json,
|
"sourceFileMap": module_graph_json,
|
||||||
"buildInfo": build_info,
|
"buildInfo": if self.use_disk_cache { build_info } else { None },
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue