diff --git a/Cargo.lock b/Cargo.lock index 9f251cd622..ba7c894604 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -645,9 +645,9 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "comrak" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82c995deda3bfdebd07d0e2af79e9da13e4b1be652b21a746f3f5b24bf0a49ef" +checksum = "9f18e72341e6cdc7489cffb76f993812a14a906db54dedb020044ccc211dcaae" dependencies = [ "derive_builder", "entities", @@ -1209,9 +1209,9 @@ dependencies = [ [[package]] name = "deno_doc" -version = "0.75.1" +version = "0.85.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc0fc1ccb5da952f569baf067364a281bbb551180b96aca5d37b4bb5f28410a" +checksum = "83b6320fb6467aa87c64e9ab09d07186f771f80f74b110e35e9063a9d6a27a30" dependencies = [ "anyhow", "cfg-if", @@ -1219,6 +1219,7 @@ dependencies = [ "deno_ast", "deno_graph", "futures", + "handlebars", "html-escape", "import_map", "indexmap 2.1.0", @@ -1226,8 +1227,8 @@ dependencies = [ "regex", "serde", "serde_json", + "syntect", "termcolor", - "tinytemplate", ] [[package]] @@ -2820,6 +2821,21 @@ dependencies = [ "serde", ] +[[package]] +name = "handlebars" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faa67bab9ff362228eb3d00bd024a4965d8231bbb7921167f0cfa66c6626b225" +dependencies = [ + "heck", + "log", + "pest", + "pest_derive", + "serde", + "serde_json", + "thiserror", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -3969,6 +3985,28 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +[[package]] +name = "onig" +version = "6.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c4b31c8722ad9171c6d77d3557db078cab2bd50afcc9d09c8b315c59df8ca4f" +dependencies = [ + "bitflags 1.3.2", + "libc", + "once_cell", + "onig_sys", +] + +[[package]] +name = "onig_sys" +version = "69.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b829e3d7e9cc74c7e315ee8edb185bf4190da5acde74afd7fc59c35b1f086e7" +dependencies = [ + "cc", + "pkg-config", +] + [[package]] name = "opaque-debug" version = "0.3.0" @@ -4153,6 +4191,51 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +[[package]] +name = "pest" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9cee2a55a544be8b89dc6848072af97a20f2422603c10865be2a42b580fff5" +dependencies = [ + "memchr", + "thiserror", + "ucd-trie", +] + +[[package]] +name = "pest_derive" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81d78524685f5ef2a3b3bd1cafbc9fcabb036253d9b1463e726a91cd16e2dfc2" +dependencies = [ + "pest", + "pest_generator", +] + +[[package]] +name = "pest_generator" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68bd1206e71118b5356dae5ddc61c8b11e28b09ef6a31acbd15ea48a28e0c227" +dependencies = [ + "pest", + "pest_meta", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "pest_meta" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c747191d4ad9e4a4ab9c8798f1e82a39affe7ef9648390b7e5548d18e099de6" +dependencies = [ + "once_cell", + "pest", + "sha2", +] + [[package]] name = "petgraph" version = "0.6.4" @@ -4620,7 +4703,7 @@ dependencies = [ "aho-corasick", "memchr", "regex-automata", - "regex-syntax", + "regex-syntax 0.8.2", ] [[package]] @@ -4631,9 +4714,15 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.2", ] +[[package]] +name = "regex-syntax" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -5907,6 +5996,25 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "syntect" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e02b4b303bf8d08bfeb0445cba5068a3d306b6baece1d5582171a9bf49188f91" +dependencies = [ + "bincode", + "bitflags 1.3.2", + "flate2", + "fnv", + "once_cell", + "onig", + "regex-syntax 0.7.5", + "serde", + "serde_json", + "thiserror", + "walkdir", +] + [[package]] name = "tar" version = "0.4.40" @@ -6068,16 +6176,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - [[package]] name = "tinyvec" version = "1.6.0" @@ -6401,6 +6499,12 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "ucd-trie" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" + [[package]] name = "unic-char-property" version = "0.9.0" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 30e1fcbccd..47b13a74e1 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -60,7 +60,7 @@ deno_ast = { workspace = true, features = ["bundler", "cjs", "codegen", "dep_gra deno_cache_dir = "=0.6.1" deno_config = "=0.6.5" deno_core = { workspace = true, features = ["include_js_files_for_snapshotting"] } -deno_doc = { version = "=0.75.1", features = ["html"] } +deno_doc = { version = "=0.85.0", features = ["html"] } deno_emit = "=0.32.0" deno_graph = "=0.62.2" deno_lint = { version = "=0.52.2", features = ["docs"] } diff --git a/cli/tools/doc.rs b/cli/tools/doc.rs index be3f029ec7..0eb83c3729 100644 --- a/cli/tools/doc.rs +++ b/cli/tools/doc.rs @@ -153,8 +153,26 @@ pub async fn doc(flags: Flags, doc_flags: DocFlags) -> Result<(), AnyError> { } }; - if let Some(html_options) = doc_flags.html { - generate_docs_directory(&doc_nodes_by_url, html_options) + if let Some(html_options) = &doc_flags.html { + let deno_ns = if doc_flags.source_files != DocSourceFileFlag::Builtin { + let deno_ns = generate_doc_nodes_for_builtin_types( + doc_flags.clone(), + cli_options, + capturing_parser, + &analyzer, + ) + .await?; + let (_, deno_ns) = deno_ns.first().unwrap(); + + let deno_ns_symbols = + deno_doc::html::compute_namespaced_symbols(deno_ns, &[]); + + Some(deno_ns_symbols) + } else { + None + }; + + generate_docs_directory(&doc_nodes_by_url, html_options, deno_ns) .boxed_local() .await } else { @@ -178,19 +196,70 @@ pub async fn doc(flags: Flags, doc_flags: DocFlags) -> Result<(), AnyError> { } } +struct DocResolver {} + +impl deno_doc::html::HrefResolver for DocResolver { + fn resolve_global_symbol(&self, symbol: &[String], _context: &str) -> String { + format!( + "https://deno.land/api@{}?s={}", + env!("CARGO_PKG_VERSION"), + symbol.join(".") + ) + } + + fn resolve_import_href( + &self, + symbol: &[String], + src: &str, + ) -> Option { + let mut url = ModuleSpecifier::parse(src).ok()?; + + if url.domain() == Some("deno.land") { + url.set_query(Some(&format!("s={}", symbol.join(".")))); + return Some(url.to_string()); + } + + None + } + + fn resolve_usage( + &self, + _current_specifier: &ModuleSpecifier, + current_file: &str, + ) -> String { + current_file.to_string() + } + + fn resolve_source(&self, location: &deno_doc::Location) -> String { + location.filename.clone() + } +} + async fn generate_docs_directory( doc_nodes_by_url: &IndexMap>, - html_options: DocHtmlFlag, + html_options: &DocHtmlFlag, + deno_ns: Option>>, ) -> Result<(), AnyError> { let cwd = std::env::current_dir().context("Failed to get CWD")?; let output_dir_resolved = cwd.join(&html_options.output); let options = deno_doc::html::GenerateOptions { - package_name: Some(html_options.name), + package_name: Some(html_options.name.to_owned()), main_entrypoint: None, - global_symbols: Default::default(), - global_symbol_href_resolver: Rc::new(|_, _| String::new()), - url_resolver: Rc::new(deno_doc::html::default_url_resolver), + global_symbols: deno_doc::html::NamespacedGlobalSymbols::new( + deno_ns + .map(|deno_ns| { + deno_ns + .into_iter() + .map(|symbol| (symbol, "deno".to_string())) + .collect() + }) + .unwrap_or_default(), + ), + rewrite_map: None, + hide_module_doc_title: false, + href_resolver: Rc::new(DocResolver {}), + sidebar_flatten_namespaces: false, }; let files = deno_doc::html::generate(options, doc_nodes_by_url)