summaryrefslogtreecommitdiff
path: root/cli/tools/check.rs
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-03-11 11:43:45 -0500
committerGitHub <noreply@github.com>2023-03-11 11:43:45 -0500
commit8db853514caae431a0ce91360d854c1b7f3c405f (patch)
tree4173976ce6c836b715af22c9aeb9f336debb8544 /cli/tools/check.rs
parente4430400ced48529730a8752c547b613a23c76ce (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.rs99
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
}