summaryrefslogtreecommitdiff
path: root/cli/util/import_map.rs
diff options
context:
space:
mode:
Diffstat (limited to 'cli/util/import_map.rs')
-rw-r--r--cli/util/import_map.rs59
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,
}