summaryrefslogtreecommitdiff
path: root/cli/tools/check.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tools/check.rs')
-rw-r--r--cli/tools/check.rs151
1 files changed, 82 insertions, 69 deletions
diff --git a/cli/tools/check.rs b/cli/tools/check.rs
index bf5e3033f..a29c4cea8 100644
--- a/cli/tools/check.rs
+++ b/cli/tools/check.rs
@@ -5,8 +5,8 @@ use std::sync::Arc;
use deno_ast::MediaType;
use deno_ast::ModuleSpecifier;
use deno_core::error::AnyError;
+use deno_graph::Module;
use deno_graph::ModuleGraph;
-use deno_graph::ModuleKind;
use deno_runtime::colors;
use once_cell::sync::Lazy;
use regex::Regex;
@@ -39,11 +39,6 @@ pub struct CheckOptions {
/// If true, valid `.tsbuildinfo` files will be ignored and type checking
/// will always occur.
pub reload: bool,
- /// If the graph has a node built-in specifier.
- ///
- /// Although this could be derived from the graph, this helps
- /// speed things up.
- pub has_node_builtin_specifier: bool,
}
/// The result of a check of a module graph.
@@ -81,8 +76,7 @@ pub fn check(
}
}
- let root_names =
- get_tsc_roots(&graph, options.has_node_builtin_specifier, check_js);
+ let root_names = get_tsc_roots(&graph, check_js);
// while there might be multiple roots, we can't "merge" the build info, so we
// try to retrieve the build info for first root, which is the most common use
// case.
@@ -168,45 +162,53 @@ fn get_check_hash(
let check_js = options.ts_config.get_check_js();
let mut sorted_modules = graph.modules().collect::<Vec<_>>();
- sorted_modules.sort_by_key(|m| m.specifier.as_str()); // make it deterministic
+ sorted_modules.sort_by_key(|m| m.specifier().as_str()); // make it deterministic
let mut has_file = false;
let mut has_file_to_type_check = false;
for module in sorted_modules {
- let ts_check =
- has_ts_check(module.media_type, module.maybe_source.as_deref());
- if ts_check {
- has_file_to_type_check = true;
- }
+ match module {
+ Module::Esm(module) => {
+ let ts_check = has_ts_check(module.media_type, &module.source);
+ if ts_check {
+ has_file_to_type_check = true;
+ }
- match module.media_type {
- MediaType::TypeScript
- | MediaType::Dts
- | MediaType::Dmts
- | MediaType::Dcts
- | MediaType::Mts
- | MediaType::Cts
- | MediaType::Tsx => {
- has_file = true;
- has_file_to_type_check = true;
- }
- MediaType::JavaScript
- | MediaType::Mjs
- | MediaType::Cjs
- | MediaType::Jsx => {
- has_file = true;
- if !check_js && !ts_check {
- continue;
+ match module.media_type {
+ MediaType::TypeScript
+ | MediaType::Dts
+ | MediaType::Dmts
+ | MediaType::Dcts
+ | MediaType::Mts
+ | MediaType::Cts
+ | MediaType::Tsx => {
+ has_file = true;
+ has_file_to_type_check = true;
+ }
+ MediaType::JavaScript
+ | MediaType::Mjs
+ | MediaType::Cjs
+ | MediaType::Jsx => {
+ has_file = true;
+ if !check_js && !ts_check {
+ continue;
+ }
+ }
+ MediaType::Json
+ | MediaType::TsBuildInfo
+ | MediaType::SourceMap
+ | MediaType::Wasm
+ | MediaType::Unknown => continue,
}
+
+ hasher.write_str(module.specifier.as_str());
+ hasher.write_str(&module.source);
+ }
+ Module::Json(_)
+ | Module::External(_)
+ | Module::Node(_)
+ | Module::Npm(_) => {
+ // ignore
}
- MediaType::Json
- | MediaType::TsBuildInfo
- | MediaType::SourceMap
- | MediaType::Wasm
- | MediaType::Unknown => continue,
- }
- hasher.write_str(module.specifier.as_str());
- if let Some(code) = &module.maybe_source {
- hasher.write_str(code);
}
}
@@ -226,38 +228,43 @@ fn get_check_hash(
/// otherwise they would be ignored if only imported into JavaScript.
fn get_tsc_roots(
graph: &ModuleGraph,
- has_node_builtin_specifier: bool,
check_js: bool,
) -> Vec<(ModuleSpecifier, MediaType)> {
let mut result = Vec::new();
- if has_node_builtin_specifier {
+ if graph.has_node_specifier {
// inject a specifier that will resolve node types
result.push((
ModuleSpecifier::parse("asset:///node_types.d.ts").unwrap(),
MediaType::Dts,
));
}
- result.extend(graph.modules().filter_map(|module| {
- if module.kind == ModuleKind::External || module.maybe_source.is_none() {
- return None;
- }
- match module.media_type {
+ 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::Jsx => Some((module.specifier.clone(), module.media_type)),
- MediaType::JavaScript | MediaType::Mjs | MediaType::Cjs
- if check_js
- || has_ts_check(
- module.media_type,
- module.maybe_source.as_deref(),
- ) =>
- {
- 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
+ }
}
- _ => None,
- }
+ MediaType::Json
+ | MediaType::Dts
+ | MediaType::Dmts
+ | MediaType::Dcts
+ | MediaType::Wasm
+ | MediaType::TsBuildInfo
+ | MediaType::SourceMap
+ | MediaType::Unknown => None,
+ },
+ Module::External(_)
+ | Module::Node(_)
+ | Module::Npm(_)
+ | Module::Json(_) => None,
}));
result
}
@@ -266,11 +273,7 @@ fn get_tsc_roots(
static TS_CHECK_RE: Lazy<Regex> =
Lazy::new(|| Regex::new(r#"(?i)^\s*@ts-check(?:\s+|$)"#).unwrap());
-fn has_ts_check(media_type: MediaType, maybe_file_text: Option<&str>) -> bool {
- let file_text = match maybe_file_text {
- Some(text) => text,
- None => return false,
- };
+fn has_ts_check(media_type: MediaType, file_text: &str) -> bool {
match &media_type {
MediaType::JavaScript
| MediaType::Mjs
@@ -278,7 +281,18 @@ fn has_ts_check(media_type: MediaType, maybe_file_text: Option<&str>) -> bool {
| MediaType::Jsx => get_leading_comments(file_text)
.iter()
.any(|text| TS_CHECK_RE.is_match(text)),
- _ => false,
+ MediaType::TypeScript
+ | MediaType::Mts
+ | MediaType::Cts
+ | MediaType::Dts
+ | MediaType::Dcts
+ | MediaType::Dmts
+ | MediaType::Tsx
+ | MediaType::Json
+ | MediaType::Wasm
+ | MediaType::TsBuildInfo
+ | MediaType::SourceMap
+ | MediaType::Unknown => false,
}
}
@@ -374,20 +388,19 @@ mod test {
fn has_ts_check_test() {
assert!(has_ts_check(
MediaType::JavaScript,
- Some("// @ts-check\nconsole.log(5);")
+ "// @ts-check\nconsole.log(5);"
));
assert!(has_ts_check(
MediaType::JavaScript,
- Some("// deno-lint-ignore\n// @ts-check\n")
+ "// deno-lint-ignore\n// @ts-check\n"
));
assert!(!has_ts_check(
MediaType::JavaScript,
- Some("test;\n// @ts-check\n")
+ "test;\n// @ts-check\n"
));
assert!(!has_ts_check(
MediaType::JavaScript,
- Some("// ts-check\nconsole.log(5);")
+ "// ts-check\nconsole.log(5);"
));
- assert!(!has_ts_check(MediaType::TypeScript, None,));
}
}