summaryrefslogtreecommitdiff
path: root/cli/tsc
diff options
context:
space:
mode:
authorDavid Sherret <dsherret@users.noreply.github.com>2023-09-28 16:43:45 -0400
committerGitHub <noreply@github.com>2023-09-28 22:43:45 +0200
commitd43e48c4e96b02289d505cd2558ba85d7d6cb57b (patch)
treed69a40b3e948a5c4ea166700610e24e35ecc61c4 /cli/tsc
parent0bd53fd52d8937afed401fe1c61bb2ba0b23501c (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')
-rw-r--r--cli/tsc/mod.rs58
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,