diff options
Diffstat (limited to 'cli/util/import_map.rs')
-rw-r--r-- | cli/util/import_map.rs | 107 |
1 files changed, 28 insertions, 79 deletions
diff --git a/cli/util/import_map.rs b/cli/util/import_map.rs index 10c5dc3f4..e26c7cb0c 100644 --- a/cli/util/import_map.rs +++ b/cli/util/import_map.rs @@ -3,13 +3,11 @@ use std::collections::HashSet; use deno_ast::ParsedSource; -use deno_core::error::AnyError; use deno_core::serde_json; use deno_core::ModuleSpecifier; use deno_graph::DefaultModuleAnalyzer; use deno_graph::DependencyDescriptor; use deno_graph::DynamicTemplatePart; -use deno_graph::MediaType; use deno_graph::TypeScriptReference; use deno_semver::jsr::JsrDepPackageReq; use deno_semver::jsr::JsrPackageReqReference; @@ -83,46 +81,11 @@ impl<'a> ImportMapUnfurler<'a> { pub fn unfurl( &self, url: &ModuleSpecifier, - data: Vec<u8>, - ) -> Result<(Vec<u8>, Vec<String>), AnyError> { - let mut diagnostics = vec![]; - let media_type = MediaType::from_specifier(url); - - match media_type { - MediaType::JavaScript - | MediaType::Jsx - | MediaType::Mjs - | MediaType::Cjs - | MediaType::TypeScript - | MediaType::Mts - | MediaType::Cts - | MediaType::Dts - | MediaType::Dmts - | MediaType::Dcts - | MediaType::Tsx => { - // continue - } - MediaType::SourceMap - | MediaType::Unknown - | MediaType::Json - | MediaType::Wasm - | MediaType::TsBuildInfo => { - // not unfurlable data - return Ok((data, diagnostics)); - } - } - - let text = String::from_utf8(data)?; - let parsed_source = deno_ast::parse_module(deno_ast::ParseParams { - specifier: url.to_string(), - text_info: deno_ast::SourceTextInfo::from_string(text), - media_type, - capture_tokens: false, - maybe_syntax: None, - scope_analysis: false, - })?; + parsed_source: &ParsedSource, + ) -> (String, Vec<String>) { + let mut diagnostics = Vec::new(); let mut text_changes = Vec::new(); - let module_info = DefaultModuleAnalyzer::module_info(&parsed_source); + let module_info = DefaultModuleAnalyzer::module_info(parsed_source); let analyze_specifier = |specifier: &str, range: &deno_graph::PositionRange, @@ -130,7 +93,7 @@ impl<'a> ImportMapUnfurler<'a> { let resolved = self.import_map.resolve(specifier, url); if let Ok(resolved) = resolved { text_changes.push(deno_ast::TextChange { - range: to_range(&parsed_source, range), + range: to_range(parsed_source, range), new_text: make_relative_to(url, &resolved), }); } @@ -148,7 +111,7 @@ impl<'a> ImportMapUnfurler<'a> { let success = try_unfurl_dynamic_dep( self.import_map, url, - &parsed_source, + parsed_source, dep, &mut text_changes, ); @@ -192,25 +155,12 @@ impl<'a> ImportMapUnfurler<'a> { &mut text_changes, ); } - Ok(( - deno_ast::apply_text_changes( - parsed_source.text_info().text_str(), - text_changes, - ) - .into_bytes(), - diagnostics, - )) - } - #[cfg(test)] - fn unfurl_to_string( - &self, - url: &ModuleSpecifier, - data: Vec<u8>, - ) -> Result<(String, Vec<String>), AnyError> { - let (data, diagnostics) = self.unfurl(url, data)?; - let content = String::from_utf8(data)?; - Ok((content, diagnostics)) + let rewritten_text = deno_ast::apply_text_changes( + parsed_source.text_info().text_str(), + text_changes, + ); + (rewritten_text, diagnostics) } } @@ -309,11 +259,26 @@ fn to_range( #[cfg(test)] mod tests { use super::*; + use deno_ast::MediaType; use deno_ast::ModuleSpecifier; use deno_core::serde_json::json; + use deno_core::url::Url; use import_map::ImportMapWithDiagnostics; use pretty_assertions::assert_eq; + fn parse_ast(specifier: &Url, source_code: &str) -> ParsedSource { + let media_type = MediaType::from_specifier(specifier); + deno_ast::parse_module(deno_ast::ParseParams { + specifier: specifier.to_string(), + media_type, + capture_tokens: false, + maybe_syntax: None, + scope_analysis: false, + text_info: deno_ast::SourceTextInfo::new(source_code.into()), + }) + .unwrap() + } + #[test] fn test_unfurling() { let deno_json_url = @@ -345,9 +310,8 @@ const test5 = await import(`lib${expr}`); const test6 = await import(`${expr}`); "#; let specifier = ModuleSpecifier::parse("file:///dev/mod.ts").unwrap(); - let (unfurled_source, d) = unfurler - .unfurl_to_string(&specifier, source_code.as_bytes().to_vec()) - .unwrap(); + let source = parse_ast(&specifier, source_code); + let (unfurled_source, d) = unfurler.unfurl(&specifier, &source); assert_eq!(d.len(), 2); assert!(d[0].starts_with("Dynamic import was not analyzable and won't use the import map once published.")); assert!(d[1].starts_with("Dynamic import was not analyzable and won't use the import map once published.")); @@ -366,20 +330,5 @@ const test6 = await import(`${expr}`); "#; assert_eq!(unfurled_source, expected_source); } - - // Unfurling file with "unknown" media type should leave it as is - { - let source_code = r#"import express from "express";" -import foo from "lib/foo.ts"; -import bar from "lib/bar.ts"; -import fizz from "fizz"; -"#; - let specifier = ModuleSpecifier::parse("file:///dev/mod").unwrap(); - let (unfurled_source, d) = unfurler - .unfurl_to_string(&specifier, source_code.as_bytes().to_vec()) - .unwrap(); - assert!(d.is_empty()); - assert_eq!(unfurled_source, source_code); - } } } |