summaryrefslogtreecommitdiff
path: root/cli/tsc/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/tsc/mod.rs')
-rw-r--r--cli/tsc/mod.rs214
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)