diff options
Diffstat (limited to 'cli/tools/vendor/mappings.rs')
-rw-r--r-- | cli/tools/vendor/mappings.rs | 255 |
1 files changed, 0 insertions, 255 deletions
diff --git a/cli/tools/vendor/mappings.rs b/cli/tools/vendor/mappings.rs deleted file mode 100644 index 6d2722b89..000000000 --- a/cli/tools/vendor/mappings.rs +++ /dev/null @@ -1,255 +0,0 @@ -// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. - -use std::collections::HashMap; -use std::collections::HashSet; -use std::path::Path; -use std::path::PathBuf; - -use deno_ast::MediaType; -use deno_ast::ModuleSpecifier; -use deno_core::error::AnyError; -use deno_graph::Module; -use deno_graph::ModuleGraph; -use deno_graph::Position; - -use crate::util::path::path_with_stem_suffix; -use crate::util::path::relative_specifier; - -use super::specifiers::dir_name_for_root; -use super::specifiers::get_unique_path; -use super::specifiers::make_url_relative; -use super::specifiers::partition_by_root_specifiers; -use super::specifiers::sanitize_filepath; - -pub struct ProxiedModule { - pub output_path: PathBuf, - pub declaration_specifier: ModuleSpecifier, -} - -/// Constructs and holds the remote specifier to local path mappings. -pub struct Mappings { - mappings: HashMap<ModuleSpecifier, PathBuf>, - base_specifiers: Vec<ModuleSpecifier>, - proxies: HashMap<ModuleSpecifier, ProxiedModule>, -} - -impl Mappings { - pub fn from_remote_modules( - graph: &ModuleGraph, - remote_modules: &[&Module], - output_dir: &Path, - ) -> Result<Self, AnyError> { - let partitioned_specifiers = partition_by_root_specifiers( - remote_modules.iter().map(|m| m.specifier()), - ); - let mut mapped_paths = HashSet::new(); - let mut mappings = HashMap::new(); - let mut proxies = HashMap::new(); - let mut base_specifiers = Vec::new(); - - for (root, specifiers) in partitioned_specifiers.into_iter() { - let base_dir = get_unique_path( - output_dir.join(dir_name_for_root(&root)), - &mut mapped_paths, - ); - for specifier in specifiers { - let module = graph.get(&specifier).unwrap(); - let media_type = match module { - Module::Js(module) => module.media_type, - Module::Json(_) => MediaType::Json, - Module::Node(_) | Module::Npm(_) | Module::External(_) => continue, - }; - let sub_path = sanitize_filepath(&make_url_relative(&root, &{ - let mut specifier = specifier.clone(); - specifier.set_query(None); - specifier - })?); - let new_path = path_with_extension( - &base_dir.join(if cfg!(windows) { - sub_path.replace('/', "\\") - } else { - sub_path - }), - &media_type.as_ts_extension()[1..], - ); - mappings - .insert(specifier, get_unique_path(new_path, &mut mapped_paths)); - } - base_specifiers.push(root.clone()); - mappings.insert(root, base_dir); - } - - // resolve all the "proxy" paths to use for when an x-typescript-types header is specified - for module in remote_modules { - if let Some(module) = module.js() { - if let Some(resolved) = &module - .maybe_types_dependency - .as_ref() - .and_then(|d| d.dependency.ok()) - { - let range = &resolved.range; - // hack to tell if it's an x-typescript-types header - let is_ts_types_header = range.start == Position::zeroed() - && range.end == Position::zeroed(); - if is_ts_types_header { - let module_path = mappings.get(&module.specifier).unwrap(); - let proxied_path = get_unique_path( - path_with_stem_suffix(module_path, ".proxied"), - &mut mapped_paths, - ); - proxies.insert( - module.specifier.clone(), - ProxiedModule { - output_path: proxied_path, - declaration_specifier: resolved.specifier.clone(), - }, - ); - } - } - } - } - - Ok(Self { - mappings, - base_specifiers, - proxies, - }) - } - - pub fn local_uri(&self, specifier: &ModuleSpecifier) -> ModuleSpecifier { - if specifier.scheme() == "file" { - specifier.clone() - } else { - let local_path = self.local_path(specifier); - if specifier.path().ends_with('/') { - ModuleSpecifier::from_directory_path(&local_path) - } else { - ModuleSpecifier::from_file_path(&local_path) - } - .unwrap_or_else(|_| { - panic!("Could not convert {} to uri.", local_path.display()) - }) - } - } - - pub fn local_path(&self, specifier: &ModuleSpecifier) -> PathBuf { - if specifier.scheme() == "file" { - specifier.to_file_path().unwrap() - } else { - self - .mappings - .get(specifier) - .unwrap_or_else(|| panic!("Could not find local path for {specifier}")) - .to_path_buf() - } - } - - pub fn relative_specifier_text( - &self, - from: &ModuleSpecifier, - to: &ModuleSpecifier, - ) -> String { - let from = self.local_uri(from); - let to = self.local_uri(to); - relative_specifier(&from, &to).unwrap() - } - - pub fn base_specifiers(&self) -> &Vec<ModuleSpecifier> { - &self.base_specifiers - } - - pub fn base_specifier( - &self, - child_specifier: &ModuleSpecifier, - ) -> &ModuleSpecifier { - self - .base_specifiers - .iter() - .find(|s| child_specifier.as_str().starts_with(s.as_str())) - .unwrap_or_else(|| { - panic!("Could not find base specifier for {child_specifier}") - }) - } - - pub fn proxied_path(&self, specifier: &ModuleSpecifier) -> Option<PathBuf> { - self.proxies.get(specifier).map(|s| s.output_path.clone()) - } - - pub fn proxied_modules( - &self, - ) -> std::collections::hash_map::Iter<'_, ModuleSpecifier, ProxiedModule> { - self.proxies.iter() - } -} - -fn path_with_extension(path: &Path, new_ext: &str) -> PathBuf { - if let Some(file_stem) = path.file_stem().map(|f| f.to_string_lossy()) { - if let Some(old_ext) = path.extension().map(|f| f.to_string_lossy()) { - if file_stem.to_lowercase().ends_with(".d") { - if new_ext.to_lowercase() == format!("d.{}", old_ext.to_lowercase()) { - // maintain casing - return path.to_path_buf(); - } - return path.with_file_name(format!( - "{}.{}", - &file_stem[..file_stem.len() - ".d".len()], - new_ext - )); - } - if new_ext.to_lowercase() == old_ext.to_lowercase() { - // maintain casing - return path.to_path_buf(); - } - let media_type = MediaType::from_path(path); - if media_type == MediaType::Unknown { - return path.with_file_name(format!( - "{}.{}", - path.file_name().unwrap().to_string_lossy(), - new_ext - )); - } - } - } - path.with_extension(new_ext) -} - -#[cfg(test)] -mod test { - use pretty_assertions::assert_eq; - - use super::*; - - #[test] - fn test_path_with_extension() { - assert_eq!( - path_with_extension(&PathBuf::from("/test.D.TS"), "ts"), - PathBuf::from("/test.ts") - ); - assert_eq!( - path_with_extension(&PathBuf::from("/test.D.MTS"), "js"), - PathBuf::from("/test.js") - ); - assert_eq!( - path_with_extension(&PathBuf::from("/test.D.TS"), "d.ts"), - // maintains casing - PathBuf::from("/test.D.TS"), - ); - assert_eq!( - path_with_extension(&PathBuf::from("/test.TS"), "ts"), - // maintains casing - PathBuf::from("/test.TS"), - ); - assert_eq!( - path_with_extension(&PathBuf::from("/test.ts"), "js"), - PathBuf::from("/test.js") - ); - assert_eq!( - path_with_extension(&PathBuf::from("/test.js"), "js"), - PathBuf::from("/test.js") - ); - assert_eq!( - path_with_extension(&PathBuf::from("/chai@1.2.3"), "js"), - PathBuf::from("/chai@1.2.3.js") - ); - } -} |