summaryrefslogtreecommitdiff
path: root/cli/tools/doc.rs
diff options
context:
space:
mode:
authorLeo Kettmeir <crowlkats@toaxl.com>2024-06-28 14:03:51 +0200
committerGitHub <noreply@github.com>2024-06-28 05:03:51 -0700
commitec9963570bb3259952e3729517d665d70131c072 (patch)
tree0519b9a422db20fc58950f72a56d6fbb9f8b3cc9 /cli/tools/doc.rs
parent8d14a9db2f0dd66492fadc498ae0070398d31d89 (diff)
chore: update deno_doc (#24308)
Diffstat (limited to 'cli/tools/doc.rs')
-rw-r--r--cli/tools/doc.rs188
1 files changed, 184 insertions, 4 deletions
diff --git a/cli/tools/doc.rs b/cli/tools/doc.rs
index e96430b57..f123fc55a 100644
--- a/cli/tools/doc.rs
+++ b/cli/tools/doc.rs
@@ -179,6 +179,7 @@ pub async fn doc(flags: Flags, doc_flags: DocFlags) -> Result<(), AnyError> {
deno_doc::html::DocNodeKindWithDrilldown::Other(node.kind),
inner: std::sync::Arc::new(node),
drilldown_parent_kind: None,
+ parent: None,
})
.collect::<Vec<_>>(),
)
@@ -186,7 +187,38 @@ pub async fn doc(flags: Flags, doc_flags: DocFlags) -> Result<(), AnyError> {
Default::default()
};
- generate_docs_directory(doc_nodes_by_url, html_options, deno_ns)
+ let rewrite_map =
+ if let Some(config_file) = cli_options.maybe_config_file().clone() {
+ let config = config_file.to_exports_config()?;
+
+ let rewrite_map = config
+ .clone()
+ .into_map()
+ .into_keys()
+ .map(|key| {
+ Ok((
+ config.get_resolved(&key)?.unwrap(),
+ key
+ .strip_prefix('.')
+ .unwrap_or(&key)
+ .strip_prefix('/')
+ .unwrap_or(&key)
+ .to_owned(),
+ ))
+ })
+ .collect::<Result<IndexMap<_, _>, AnyError>>()?;
+
+ Some(rewrite_map)
+ } else {
+ None
+ };
+
+ generate_docs_directory(
+ doc_nodes_by_url,
+ html_options,
+ deno_ns,
+ rewrite_map,
+ )
} else {
let modules_len = doc_nodes_by_url.len();
let doc_nodes =
@@ -210,6 +242,7 @@ pub async fn doc(flags: Flags, doc_flags: DocFlags) -> Result<(), AnyError> {
struct DocResolver {
deno_ns: std::collections::HashSet<Vec<String>>,
+ strip_trailing_html: bool,
}
impl deno_doc::html::HrefResolver for DocResolver {
@@ -218,7 +251,17 @@ impl deno_doc::html::HrefResolver for DocResolver {
current: UrlResolveKind,
target: UrlResolveKind,
) -> String {
- deno_doc::html::href_path_resolve(current, target)
+ let path = deno_doc::html::href_path_resolve(current, target);
+ if self.strip_trailing_html {
+ if let Some(path) = path
+ .strip_suffix("index.html")
+ .or_else(|| path.strip_suffix(".html"))
+ {
+ return path.to_owned();
+ }
+ }
+
+ path
}
fn resolve_global_symbol(&self, symbol: &[String]) -> Option<String> {
@@ -257,21 +300,158 @@ impl deno_doc::html::HrefResolver for DocResolver {
}
}
+struct DenoDocResolver(bool);
+
+impl deno_doc::html::HrefResolver for DenoDocResolver {
+ fn resolve_path(
+ &self,
+ current: UrlResolveKind,
+ target: UrlResolveKind,
+ ) -> String {
+ let path = deno_doc::html::href_path_resolve(current, target);
+ if self.0 {
+ if let Some(path) = path
+ .strip_suffix("index.html")
+ .or_else(|| path.strip_suffix(".html"))
+ {
+ return path.to_owned();
+ }
+ }
+
+ path
+ }
+
+ fn resolve_global_symbol(&self, _symbol: &[String]) -> Option<String> {
+ None
+ }
+
+ fn resolve_import_href(
+ &self,
+ _symbol: &[String],
+ _src: &str,
+ ) -> Option<String> {
+ None
+ }
+
+ fn resolve_usage(&self, _current_resolve: UrlResolveKind) -> Option<String> {
+ None
+ }
+
+ fn resolve_source(&self, _location: &deno_doc::Location) -> Option<String> {
+ None
+ }
+}
+
+struct NodeDocResolver(bool);
+
+impl deno_doc::html::HrefResolver for NodeDocResolver {
+ fn resolve_path(
+ &self,
+ current: UrlResolveKind,
+ target: UrlResolveKind,
+ ) -> String {
+ let path = deno_doc::html::href_path_resolve(current, target);
+ if self.0 {
+ if let Some(path) = path
+ .strip_suffix("index.html")
+ .or_else(|| path.strip_suffix(".html"))
+ {
+ return path.to_owned();
+ }
+ }
+
+ path
+ }
+
+ fn resolve_global_symbol(&self, _symbol: &[String]) -> Option<String> {
+ None
+ }
+
+ fn resolve_import_href(
+ &self,
+ _symbol: &[String],
+ _src: &str,
+ ) -> Option<String> {
+ None
+ }
+
+ fn resolve_usage(&self, current_resolve: UrlResolveKind) -> Option<String> {
+ current_resolve
+ .get_file()
+ .map(|file| format!("node:{}", file.path))
+ }
+
+ fn resolve_source(&self, _location: &deno_doc::Location) -> Option<String> {
+ None
+ }
+}
+
fn generate_docs_directory(
doc_nodes_by_url: IndexMap<ModuleSpecifier, Vec<doc::DocNode>>,
html_options: &DocHtmlFlag,
deno_ns: std::collections::HashSet<Vec<String>>,
+ rewrite_map: Option<IndexMap<ModuleSpecifier, String>>,
) -> Result<(), AnyError> {
let cwd = std::env::current_dir().context("Failed to get CWD")?;
let output_dir_resolved = cwd.join(&html_options.output);
+ let internal_env = std::env::var("DENO_INTERNAL_HTML_DOCS").ok();
+
+ let href_resolver: Rc<dyn deno_doc::html::HrefResolver> = if internal_env
+ .as_ref()
+ .is_some_and(|internal_html_docs| internal_html_docs == "node")
+ {
+ Rc::new(NodeDocResolver(html_options.strip_trailing_html))
+ } else if internal_env
+ .as_ref()
+ .is_some_and(|internal_html_docs| internal_html_docs == "deno")
+ || deno_ns.is_empty()
+ {
+ Rc::new(DenoDocResolver(html_options.strip_trailing_html))
+ } else {
+ Rc::new(DocResolver {
+ deno_ns,
+ strip_trailing_html: html_options.strip_trailing_html,
+ })
+ };
+
+ let category_docs =
+ if let Some(category_docs_path) = &html_options.category_docs_path {
+ let content = std::fs::read(category_docs_path)?;
+ Some(deno_core::serde_json::from_slice(&content)?)
+ } else {
+ None
+ };
+
+ let symbol_redirect_map = if let Some(symbol_redirect_map_path) =
+ &html_options.symbol_redirect_map_path
+ {
+ let content = std::fs::read(symbol_redirect_map_path)?;
+ Some(deno_core::serde_json::from_slice(&content)?)
+ } else {
+ None
+ };
+
+ let default_symbol_map = if let Some(default_symbol_map_path) =
+ &html_options.default_symbol_map_path
+ {
+ let content = std::fs::read(default_symbol_map_path)?;
+ Some(deno_core::serde_json::from_slice(&content)?)
+ } else {
+ None
+ };
+
let options = deno_doc::html::GenerateOptions {
package_name: html_options.name.clone(),
main_entrypoint: None,
- rewrite_map: None,
- href_resolver: Rc::new(DocResolver { deno_ns }),
+ rewrite_map,
+ href_resolver,
usage_composer: None,
composable_output: false,
+ category_docs,
+ disable_search: internal_env.is_some(),
+ symbol_redirect_map,
+ default_symbol_map,
};
let files = deno_doc::html::generate(options, doc_nodes_by_url)