diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-03-11 11:43:45 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-11 11:43:45 -0500 |
commit | 8db853514caae431a0ce91360d854c1b7f3c405f (patch) | |
tree | 4173976ce6c836b715af22c9aeb9f336debb8544 /cli/tools/check.rs | |
parent | e4430400ced48529730a8752c547b613a23c76ce (diff) |
fix(check): regression where config "types" entries caused type checking errors (#18124)
Closes #18117
Closes #18121 (this is just over 10ms faster in a directory one up from
the root folder)
cc @nayeemrmn
Diffstat (limited to 'cli/tools/check.rs')
-rw-r--r-- | cli/tools/check.rs | 99 |
1 files changed, 73 insertions, 26 deletions
diff --git a/cli/tools/check.rs b/cli/tools/check.rs index 1ea8acb46..77bc0f441 100644 --- a/cli/tools/check.rs +++ b/cli/tools/check.rs @@ -1,5 +1,6 @@ // Copyright 2018-2023 the Deno authors. All rights reserved. MIT license. +use std::collections::HashSet; use std::sync::Arc; use deno_ast::MediaType; @@ -98,7 +99,6 @@ pub fn check( debug: options.debug, graph: graph.clone(), hash_data, - maybe_config_specifier: options.maybe_config_specifier, maybe_npm_resolver: Some(npm_resolver.clone()), maybe_tsbuildinfo, root_names, @@ -230,6 +230,41 @@ fn get_tsc_roots( graph: &ModuleGraph, check_js: bool, ) -> Vec<(ModuleSpecifier, MediaType)> { + fn maybe_get_check_entry( + module: &deno_graph::Module, + check_js: bool, + ) -> Option<(ModuleSpecifier, MediaType)> { + match module { + Module::Esm(module) => match module.media_type { + MediaType::TypeScript + | MediaType::Tsx + | MediaType::Mts + | MediaType::Cts + | MediaType::Dts + | MediaType::Dmts + | MediaType::Dcts + | MediaType::Jsx => Some((module.specifier.clone(), module.media_type)), + MediaType::JavaScript | MediaType::Mjs | MediaType::Cjs => { + if check_js || has_ts_check(module.media_type, &module.source) { + Some((module.specifier.clone(), module.media_type)) + } else { + None + } + } + MediaType::Json + | MediaType::Wasm + | MediaType::TsBuildInfo + | MediaType::SourceMap + | MediaType::Unknown => None, + }, + Module::External(_) + | Module::Node(_) + | Module::Npm(_) + | Module::Json(_) => None, + } + } + + // todo(https://github.com/denoland/deno_graph/pull/253/): pre-allocate this let mut result = Vec::new(); if graph.has_node_specifier { // inject a specifier that will resolve node types @@ -238,33 +273,45 @@ fn get_tsc_roots( MediaType::Dts, )); } - result.extend(graph.modules().filter_map(|module| match module { - Module::Esm(module) => match module.media_type { - MediaType::TypeScript - | MediaType::Tsx - | MediaType::Mts - | MediaType::Cts - | MediaType::Dts - | MediaType::Dmts - | MediaType::Dcts - | MediaType::Jsx => Some((module.specifier.clone(), module.media_type)), - MediaType::JavaScript | MediaType::Mjs | MediaType::Cjs => { - if check_js || has_ts_check(module.media_type, &module.source) { - Some((module.specifier.clone(), module.media_type)) - } else { - None + + let mut seen_roots = + HashSet::with_capacity(graph.imports.len() + graph.roots.len()); + + // put in the global types first so that they're resolved before anything else + for import in graph.imports.values() { + for dep in import.dependencies.values() { + let specifier = dep.get_type().or_else(|| dep.get_code()); + if let Some(specifier) = &specifier { + if seen_roots.insert(*specifier) { + let maybe_entry = graph + .get(specifier) + .and_then(|m| maybe_get_check_entry(m, check_js)); + if let Some(entry) = maybe_entry { + result.push(entry); + } } } - MediaType::Json - | MediaType::Wasm - | MediaType::TsBuildInfo - | MediaType::SourceMap - | MediaType::Unknown => None, - }, - Module::External(_) - | Module::Node(_) - | Module::Npm(_) - | Module::Json(_) => None, + } + } + + // then the roots + for root in &graph.roots { + if let Some(module) = graph.get(root) { + if seen_roots.insert(root) { + if let Some(entry) = maybe_get_check_entry(module, check_js) { + result.push(entry); + } + } + } + } + + // now the rest + result.extend(graph.modules().filter_map(|module| { + if seen_roots.contains(module.specifier()) { + None + } else { + maybe_get_check_entry(module, check_js) + } })); result } |