diff options
Diffstat (limited to 'cli/tsc/mod.rs')
-rw-r--r-- | cli/tsc/mod.rs | 214 |
1 files changed, 118 insertions, 96 deletions
diff --git a/cli/tsc/mod.rs b/cli/tsc/mod.rs index 3da2f5f25..439a0de20 100644 --- a/cli/tsc/mod.rs +++ b/cli/tsc/mod.rs @@ -165,6 +165,12 @@ pub static LAZILY_LOADED_STATIC_ASSETS: Lazy< "lib.webworker.iterable.d.ts", inc!("lib.webworker.iterable.d.ts"), ), + ( + // Special file that can be used to inject the @types/node package. + // This is used for `node:` specifiers. + "node_types.d.ts", + "/// <reference types=\"npm:@types/node\" />\n", + ), ]) .iter() .cloned() @@ -599,117 +605,133 @@ fn op_resolve( "Error converting a string module specifier for \"op_resolve\".", )? }; - for specifier in &args.specifiers { + for specifier in args.specifiers { + if let Some(module_name) = specifier.strip_prefix("node:") { + if crate::node::resolve_builtin_node_module(module_name).is_ok() { + // return itself for node: specifiers because during type checking + // we resolve to the ambient modules in the @types/node package + // rather than deno_std/node + resolved.push((specifier, MediaType::Dts.to_string())); + continue; + } + } + if specifier.starts_with("asset:///") { - resolved.push(( - specifier.clone(), - MediaType::from(specifier).as_ts_extension().to_string(), - )); - } else { - let graph_data = state.graph_data.read(); - let resolved_dep = match graph_data.get_dependencies(&referrer) { - Some(dependencies) => dependencies.get(specifier).map(|d| { - if matches!(d.maybe_type, Resolved::Ok { .. }) { - &d.maybe_type - } else { - &d.maybe_code - } - }), - None => None, - }; - let maybe_result = match resolved_dep { - Some(Resolved::Ok { specifier, .. }) => { - let specifier = graph_data.follow_redirect(specifier); - match graph_data.get(&specifier) { - Some(ModuleEntry::Module { - media_type, - maybe_types, - .. - }) => match maybe_types { - Some(Resolved::Ok { specifier, .. }) => { - let types = graph_data.follow_redirect(specifier); - match graph_data.get(&types) { - Some(ModuleEntry::Module { media_type, .. }) => { - Some((types, *media_type)) - } - _ => None, + let media_type = + MediaType::from(&specifier).as_ts_extension().to_string(); + resolved.push((specifier, media_type)); + continue; + } + + let graph_data = state.graph_data.read(); + let resolved_dep = match graph_data.get_dependencies(&referrer) { + Some(dependencies) => dependencies.get(&specifier).map(|d| { + if matches!(d.maybe_type, Resolved::Ok { .. }) { + &d.maybe_type + } else { + &d.maybe_code + } + }), + None => None, + }; + let maybe_result = match resolved_dep { + Some(Resolved::Ok { specifier, .. }) => { + let specifier = graph_data.follow_redirect(specifier); + match graph_data.get(&specifier) { + Some(ModuleEntry::Module { + media_type, + maybe_types, + .. + }) => match maybe_types { + Some(Resolved::Ok { specifier, .. }) => { + let types = graph_data.follow_redirect(specifier); + match graph_data.get(&types) { + Some(ModuleEntry::Module { media_type, .. }) => { + Some((types, *media_type)) } + _ => None, } - _ => Some((specifier, *media_type)), - }, - _ => { - // handle npm:<package> urls - if let Ok(npm_ref) = - NpmPackageReference::from_specifier(&specifier) - { - if let Some(npm_resolver) = &state.maybe_npm_resolver { - Some(resolve_npm_package_reference_types( - &npm_ref, - npm_resolver, - )?) - } else { - None - } + } + _ => Some((specifier, *media_type)), + }, + _ => { + // handle npm:<package> urls + if let Ok(npm_ref) = NpmPackageReference::from_specifier(&specifier) + { + if let Some(npm_resolver) = &state.maybe_npm_resolver { + Some(resolve_npm_package_reference_types( + &npm_ref, + npm_resolver, + )?) } else { None } - } - } - } - _ => { - state.maybe_npm_resolver.as_ref().and_then(|npm_resolver| { - if npm_resolver.in_npm_package(&referrer) { - // we're in an npm package, so use node resolution - Some(NodeResolution::into_specifier_and_media_type( - node::node_resolve( - specifier, - &referrer, - NodeResolutionMode::Types, - npm_resolver, - &mut PermissionsContainer::allow_all(), - ) - .ok() - .flatten(), - )) } else { None } - }) + } } - }; - let result = match maybe_result { - Some((specifier, media_type)) => { - let specifier_str = match specifier.scheme() { - "data" | "blob" => { - let specifier_str = hash_url(&specifier, media_type); + } + _ => { + if let Some(npm_resolver) = state.maybe_npm_resolver.as_ref() { + if npm_resolver.in_npm_package(&referrer) { + // we're in an npm package, so use node resolution + Some(NodeResolution::into_specifier_and_media_type( + node::node_resolve( + &specifier, + &referrer, + NodeResolutionMode::Types, + npm_resolver, + &mut PermissionsContainer::allow_all(), + ) + .ok() + .flatten(), + )) + } else if let Ok(npm_ref) = NpmPackageReference::from_str(&specifier) + { + // this could occur when resolving npm:@types/node when it is + // injected and not part of the graph + Some(resolve_npm_package_reference_types(&npm_ref, npm_resolver)?) + } else { + None + } + } else { + None + } + } + }; + let result = match maybe_result { + Some((specifier, media_type)) => { + let specifier_str = match specifier.scheme() { + "data" | "blob" => { + let specifier_str = hash_url(&specifier, media_type); + state + .remapped_specifiers + .insert(specifier_str.clone(), specifier); + specifier_str + } + _ => { + if let Some(specifier_str) = + maybe_remap_specifier(&specifier, media_type) + { state .remapped_specifiers .insert(specifier_str.clone(), specifier); specifier_str + } else { + specifier.to_string() } - _ => { - if let Some(specifier_str) = - maybe_remap_specifier(&specifier, media_type) - { - state - .remapped_specifiers - .insert(specifier_str.clone(), specifier); - specifier_str - } else { - specifier.to_string() - } - } - }; - (specifier_str, media_type.as_ts_extension().into()) - } - None => ( - "deno:///missing_dependency.d.ts".to_string(), - ".d.ts".to_string(), - ), - }; - log::debug!("Resolved {} to {:?}", specifier, result); - resolved.push(result); - } + } + }; + (specifier_str, media_type.as_ts_extension().into()) + } + None => ( + "deno:///missing_dependency.d.ts".to_string(), + ".d.ts".to_string(), + ), + }; + log::debug!("Resolved {} to {:?}", specifier, result); + resolved.push(result); } Ok(resolved) |