diff options
author | David Sherret <dsherret@users.noreply.github.com> | 2023-09-28 16:43:45 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-28 22:43:45 +0200 |
commit | d43e48c4e96b02289d505cd2558ba85d7d6cb57b (patch) | |
tree | d69a40b3e948a5c4ea166700610e24e35ecc61c4 /cli/tsc/mod.rs | |
parent | 0bd53fd52d8937afed401fe1c61bb2ba0b23501c (diff) |
refactor(ext/node): remove dependency on deno_npm and deno_semver (#20718)
This is required from BYONM (bring your own node_modules).
Part of #18967
Diffstat (limited to 'cli/tsc/mod.rs')
-rw-r--r-- | cli/tsc/mod.rs | 58 |
1 files changed, 37 insertions, 21 deletions
diff --git a/cli/tsc/mod.rs b/cli/tsc/mod.rs index 04e8dec04..50b7dc9e4 100644 --- a/cli/tsc/mod.rs +++ b/cli/tsc/mod.rs @@ -4,6 +4,7 @@ use crate::args::TsConfig; use crate::args::TypeCheckMode; use crate::cache::FastInsecureHasher; use crate::node; +use crate::npm::CliNpmResolver; use crate::util::checksum; use crate::util::path::mapped_specifier_for_tsc; @@ -293,6 +294,12 @@ pub struct EmittedFile { pub media_type: MediaType, } +#[derive(Debug)] +pub struct RequestNpmState { + pub node_resolver: Arc<NodeResolver>, + pub npm_resolver: Arc<CliNpmResolver>, +} + /// A structure representing a request to be sent to the tsc runtime. #[derive(Debug)] pub struct Request { @@ -303,7 +310,7 @@ pub struct Request { pub debug: bool, pub graph: Arc<ModuleGraph>, pub hash_data: u64, - pub maybe_node_resolver: Option<Arc<NodeResolver>>, + pub maybe_npm: Option<RequestNpmState>, pub maybe_tsbuildinfo: Option<String>, /// A vector of strings that represent the root/entry point modules for the /// program. @@ -327,7 +334,7 @@ struct State { graph: Arc<ModuleGraph>, maybe_tsbuildinfo: Option<String>, maybe_response: Option<RespondArgs>, - maybe_node_resolver: Option<Arc<NodeResolver>>, + maybe_npm: Option<RequestNpmState>, remapped_specifiers: HashMap<String, ModuleSpecifier>, root_map: HashMap<String, ModuleSpecifier>, current_dir: PathBuf, @@ -340,7 +347,7 @@ impl Default for State { graph: Arc::new(ModuleGraph::new(GraphKind::All)), maybe_tsbuildinfo: Default::default(), maybe_response: Default::default(), - maybe_node_resolver: Default::default(), + maybe_npm: Default::default(), remapped_specifiers: Default::default(), root_map: Default::default(), current_dir: Default::default(), @@ -352,7 +359,7 @@ impl State { pub fn new( graph: Arc<ModuleGraph>, hash_data: u64, - maybe_node_resolver: Option<Arc<NodeResolver>>, + maybe_npm: Option<RequestNpmState>, maybe_tsbuildinfo: Option<String>, root_map: HashMap<String, ModuleSpecifier>, remapped_specifiers: HashMap<String, ModuleSpecifier>, @@ -361,7 +368,7 @@ impl State { State { hash_data, graph, - maybe_node_resolver, + maybe_npm, maybe_tsbuildinfo, maybe_response: None, remapped_specifiers, @@ -496,9 +503,9 @@ fn op_load(state: &mut OpState, args: Value) -> Result<Value, AnyError> { } } } else if state - .maybe_node_resolver + .maybe_npm .as_ref() - .map(|resolver| resolver.in_npm_package(specifier)) + .map(|npm| npm.node_resolver.in_npm_package(specifier)) .unwrap_or(false) { media_type = MediaType::from_specifier(specifier); @@ -650,9 +657,13 @@ fn resolve_graph_specifier_types( Ok(Some((module.specifier.clone(), module.media_type))) } Some(Module::Npm(module)) => { - if let Some(node_resolver) = &state.maybe_node_resolver { - let maybe_resolution = node_resolver.resolve_npm_reference( - &module.nv_reference, + if let Some(npm) = &state.maybe_npm { + let package_folder = npm + .npm_resolver + .resolve_pkg_folder_from_deno_module(module.nv_reference.nv())?; + let maybe_resolution = npm.node_resolver.resolve_npm_reference( + &package_folder, + module.nv_reference.sub_path(), NodeResolutionMode::Types, &PermissionsContainer::allow_all(), )?; @@ -665,11 +676,11 @@ fn resolve_graph_specifier_types( } Some(Module::External(module)) => { // we currently only use "External" for when the module is in an npm package - Ok(state.maybe_node_resolver.as_ref().map(|node_resolver| { + Ok(state.maybe_npm.as_ref().map(|npm| { let specifier = node::resolve_specifier_into_node_modules(&module.specifier); NodeResolution::into_specifier_and_media_type( - node_resolver.url_to_node_resolution(specifier).ok(), + npm.node_resolver.url_to_node_resolution(specifier).ok(), ) })) } @@ -682,10 +693,11 @@ fn resolve_non_graph_specifier_types( referrer: &ModuleSpecifier, state: &State, ) -> Result<Option<(ModuleSpecifier, MediaType)>, AnyError> { - let node_resolver = match state.maybe_node_resolver.as_ref() { - Some(node_resolver) => node_resolver, + let npm = match state.maybe_npm.as_ref() { + Some(npm) => npm, None => return Ok(None), // we only support non-graph types for npm packages }; + let node_resolver = &npm.node_resolver; if node_resolver.in_npm_package(referrer) { // we're in an npm package, so use node resolution Ok(Some(NodeResolution::into_specifier_and_media_type( @@ -699,13 +711,17 @@ fn resolve_non_graph_specifier_types( .ok() .flatten(), ))) - } else if let Ok(npm_ref) = NpmPackageReqReference::from_str(specifier) { + } else if let Ok(npm_req_ref) = NpmPackageReqReference::from_str(specifier) { // todo(dsherret): add support for injecting this in the graph so // we don't need this special code here. // This could occur when resolving npm:@types/node when it is // injected and not part of the graph - let maybe_resolution = node_resolver.resolve_npm_req_reference( - &npm_ref, + let package_folder = npm + .npm_resolver + .resolve_pkg_folder_from_deno_module_req(npm_req_ref.req())?; + let maybe_resolution = node_resolver.resolve_npm_reference( + &package_folder, + npm_req_ref.sub_path(), NodeResolutionMode::Types, &PermissionsContainer::allow_all(), )?; @@ -722,9 +738,9 @@ fn op_is_node_file(state: &mut OpState, #[string] path: &str) -> bool { let state = state.borrow::<State>(); match ModuleSpecifier::parse(path) { Ok(specifier) => state - .maybe_node_resolver + .maybe_npm .as_ref() - .map(|r| r.in_npm_package(&specifier)) + .map(|n| n.node_resolver.in_npm_package(&specifier)) .unwrap_or(false), Err(_) => false, } @@ -783,7 +799,7 @@ pub fn exec(request: Request) -> Result<Response, AnyError> { state.put(State::new( options.request.graph, options.request.hash_data, - options.request.maybe_node_resolver, + options.request.maybe_npm, options.request.maybe_tsbuildinfo, options.root_map, options.remapped_specifiers, @@ -952,7 +968,7 @@ mod tests { debug: false, graph: Arc::new(graph), hash_data, - maybe_node_resolver: None, + maybe_npm: None, maybe_tsbuildinfo: None, root_names: vec![(specifier.clone(), MediaType::TypeScript)], check_mode: TypeCheckMode::All, |