summaryrefslogtreecommitdiff
path: root/cli/main.rs
diff options
context:
space:
mode:
authorLiam Murphy <43807659+Liamolucko@users.noreply.github.com>2021-02-26 02:24:05 +1100
committerGitHub <noreply@github.com>2021-02-25 16:24:05 +0100
commitcdae4423c27443e0085d59f45eda1c978f186a1c (patch)
tree74107cebfe5a49a8021ef3fc02c60b30548163be /cli/main.rs
parent687ff2ab14d6a735aa5bf0ec57ef00cfe0c04e4b (diff)
feat(cli/doc): use type definitions "deno doc" if available (#8459)
This commit adds support for type definitions in "deno doc"; with this change "deno doc" is able to leverage the same directives as TS compiler. Co-authored-by: Bartek IwaƄczuk <biwanczuk@gmail.com>
Diffstat (limited to 'cli/main.rs')
-rw-r--r--cli/main.rs124
1 files changed, 6 insertions, 118 deletions
diff --git a/cli/main.rs b/cli/main.rs
index e957b9342..7071d775a 100644
--- a/cli/main.rs
+++ b/cli/main.rs
@@ -44,12 +44,10 @@ mod tsc_config;
mod version;
use crate::file_fetcher::File;
-use crate::file_fetcher::FileFetcher;
use crate::file_watcher::ModuleResolutionResult;
use crate::flags::DenoSubcommand;
use crate::flags::Flags;
use crate::fmt_errors::PrettyJsError;
-use crate::import_map::ImportMap;
use crate::media_type::MediaType;
use crate::module_loader::CliModuleLoader;
use crate::program_state::exit_unstable;
@@ -66,8 +64,6 @@ use deno_core::serde_json;
use deno_core::serde_json::json;
use deno_core::v8_set_flags;
use deno_core::ModuleSpecifier;
-use deno_doc as doc;
-use deno_doc::parser::DocFileLoader;
use deno_runtime::ops::worker_host::CreateWebWorkerCb;
use deno_runtime::permissions::Permissions;
use deno_runtime::web_worker::WebWorker;
@@ -228,7 +224,9 @@ pub fn create_main_worker(
worker
}
-fn write_to_stdout_ignore_sigpipe(bytes: &[u8]) -> Result<(), std::io::Error> {
+pub fn write_to_stdout_ignore_sigpipe(
+ bytes: &[u8],
+) -> Result<(), std::io::Error> {
use std::io::ErrorKind;
match std::io::stdout().write_all(bytes) {
@@ -240,7 +238,7 @@ fn write_to_stdout_ignore_sigpipe(bytes: &[u8]) -> Result<(), std::io::Error> {
}
}
-fn write_json_to_stdout<T>(value: &T) -> Result<(), AnyError>
+pub fn write_json_to_stdout<T>(value: &T) -> Result<(), AnyError>
where
T: ?Sized + serde::ser::Serialize,
{
@@ -278,7 +276,7 @@ fn print_cache_info(
}
}
-fn get_types(unstable: bool) -> String {
+pub fn get_types(unstable: bool) -> String {
let mut types = format!(
"{}\n{}\n{}\n{}\n{}\n{}",
crate::tsc::DENO_NS_LIB,
@@ -684,59 +682,6 @@ async fn bundle_command(
Ok(())
}
-struct DocLoader {
- fetcher: FileFetcher,
- maybe_import_map: Option<ImportMap>,
-}
-
-impl DocFileLoader for DocLoader {
- fn resolve(
- &self,
- specifier: &str,
- referrer: &str,
- ) -> Result<String, doc::DocError> {
- let maybe_resolved =
- if let Some(import_map) = self.maybe_import_map.as_ref() {
- import_map
- .resolve(specifier, referrer)
- .map_err(|e| doc::DocError::Resolve(e.to_string()))?
- } else {
- None
- };
-
- let resolved_specifier = if let Some(resolved) = maybe_resolved {
- resolved
- } else {
- deno_core::resolve_import(specifier, referrer)
- .map_err(|e| doc::DocError::Resolve(e.to_string()))?
- };
-
- Ok(resolved_specifier.to_string())
- }
-
- fn load_source_code(
- &self,
- specifier: &str,
- ) -> Pin<Box<dyn Future<Output = Result<String, doc::DocError>>>> {
- let fetcher = self.fetcher.clone();
- let specifier =
- resolve_url_or_path(specifier).expect("Expected valid specifier");
- async move {
- let source_file = fetcher
- .fetch(&specifier, &Permissions::allow_all())
- .await
- .map_err(|e| {
- doc::DocError::Io(std::io::Error::new(
- std::io::ErrorKind::Other,
- e.to_string(),
- ))
- })?;
- Ok(source_file.source)
- }
- .boxed_local()
- }
-}
-
async fn doc_command(
flags: Flags,
source_file: Option<String>,
@@ -744,64 +689,7 @@ async fn doc_command(
maybe_filter: Option<String>,
private: bool,
) -> Result<(), AnyError> {
- let program_state = ProgramState::build(flags.clone()).await?;
- let source_file = source_file.unwrap_or_else(|| "--builtin".to_string());
-
- let loader = Box::new(DocLoader {
- fetcher: program_state.file_fetcher.clone(),
- maybe_import_map: program_state.maybe_import_map.clone(),
- });
- let doc_parser = doc::DocParser::new(loader, private);
-
- let parse_result = if source_file == "--builtin" {
- let syntax = ast::get_syntax(&MediaType::Dts);
- doc_parser.parse_source(
- "lib.deno.d.ts",
- syntax,
- get_types(flags.unstable).as_str(),
- )
- } else {
- let path = PathBuf::from(&source_file);
- let media_type = MediaType::from(&path);
- let syntax = ast::get_syntax(&media_type);
- let module_specifier = resolve_url_or_path(&source_file).unwrap();
- doc_parser
- .parse_with_reexports(&module_specifier.to_string(), syntax)
- .await
- };
-
- let mut doc_nodes = match parse_result {
- Ok(nodes) => nodes,
- Err(e) => {
- eprintln!("{}", e);
- std::process::exit(1);
- }
- };
-
- if json {
- write_json_to_stdout(&doc_nodes)
- } else {
- doc_nodes.retain(|doc_node| doc_node.kind != doc::DocNodeKind::Import);
- let details = if let Some(filter) = maybe_filter {
- let nodes =
- doc::find_nodes_by_name_recursively(doc_nodes, filter.clone());
- if nodes.is_empty() {
- eprintln!("Node {} was not found!", filter);
- std::process::exit(1);
- }
- format!(
- "{}",
- doc::DocPrinter::new(&nodes, colors::use_color(), private)
- )
- } else {
- format!(
- "{}",
- doc::DocPrinter::new(&doc_nodes, colors::use_color(), private)
- )
- };
-
- write_to_stdout_ignore_sigpipe(details.as_bytes()).map_err(AnyError::from)
- }
+ tools::doc::print_docs(flags, source_file, json, maybe_filter, private).await
}
async fn format_command(