diff options
Diffstat (limited to 'cli/util/import_map.rs')
-rw-r--r-- | cli/util/import_map.rs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/cli/util/import_map.rs b/cli/util/import_map.rs index 0b78a133c..10c5dc3f4 100644 --- a/cli/util/import_map.rs +++ b/cli/util/import_map.rs @@ -1,17 +1,76 @@ // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. +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; +use deno_semver::npm::NpmPackageReqReference; use import_map::ImportMap; use crate::graph_util::format_range_with_colors; +pub fn import_map_deps(value: &serde_json::Value) -> HashSet<JsrDepPackageReq> { + let Some(obj) = value.as_object() else { + return Default::default(); + }; + let values = imports_values(obj.get("imports")) + .into_iter() + .chain(scope_values(obj.get("scopes"))); + values_to_set(values) +} + +pub fn deno_json_deps( + config: &deno_config::ConfigFile, +) -> HashSet<JsrDepPackageReq> { + let values = imports_values(config.json.imports.as_ref()) + .into_iter() + .chain(scope_values(config.json.scopes.as_ref())); + values_to_set(values) +} + +fn imports_values(value: Option<&serde_json::Value>) -> Vec<&String> { + let Some(obj) = value.and_then(|v| v.as_object()) else { + return Vec::new(); + }; + let mut items = Vec::with_capacity(obj.len()); + for value in obj.values() { + if let serde_json::Value::String(value) = value { + items.push(value); + } + } + items +} + +fn scope_values(value: Option<&serde_json::Value>) -> Vec<&String> { + let Some(obj) = value.and_then(|v| v.as_object()) else { + return Vec::new(); + }; + obj.values().flat_map(|v| imports_values(Some(v))).collect() +} + +fn values_to_set<'a>( + values: impl Iterator<Item = &'a String>, +) -> HashSet<JsrDepPackageReq> { + let mut entries = HashSet::new(); + for value in values { + if let Ok(req_ref) = JsrPackageReqReference::from_str(value) { + entries.insert(JsrDepPackageReq::jsr(req_ref.into_inner().req)); + } else if let Ok(req_ref) = NpmPackageReqReference::from_str(value) { + entries.insert(JsrDepPackageReq::npm(req_ref.into_inner().req)); + } + } + entries +} + pub struct ImportMapUnfurler<'a> { import_map: &'a ImportMap, } |