Skip to content

Commit 51558a5

Browse files
authored
feat: docnodes v2 format (#786)
1 parent 8cedc32 commit 51558a5

304 files changed

Lines changed: 27361 additions & 26751 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ deno_graph = { version = "0.107.0", default-features = false, features = [
1818
deno_ast = { version = "0.53.0" }
1919
import_map = "0.25.0"
2020
serde = { version = "1.0.204", features = ["derive"] }
21+
serde_json = { version = "1.0.122", features = ["preserve_order"] }
2122

2223
[lib]
2324
name = "deno_doc"
@@ -36,7 +37,7 @@ indexmap = "2.3.0"
3637
lazy_static = "1.5.0"
3738
regex = "1.10.6"
3839
serde.workspace = true
39-
serde_json = { version = "1.0.122", features = ["preserve_order"] }
40+
serde_json.workspace = true
4041
termcolor = "1.4.1"
4142
itoa = "1.0.14"
4243
deno_path_util = "0.6.4"

deno.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,11 @@
1010
"workspace": ["js"],
1111
"exclude": ["target", "benches/fixtures"],
1212
"fmt": {
13-
"exclude": ["**/*.gen.css", "generated_docs"]
13+
"exclude": [
14+
"**/*.gen.css",
15+
"generated_docs",
16+
"tests/testdata/@zod_zod_4.3.6_raw.json"
17+
]
1418
},
1519
"lint": {
1620
"exclude": ["src/html", "tests/testdata"]

examples/ddoc/main.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ use deno_doc::html::HrefResolver;
1313
use deno_doc::html::UrlResolveKind;
1414
use deno_doc::html::UsageComposer;
1515
use deno_doc::html::UsageComposerEntry;
16-
use deno_doc::node::DocNodeDef;
1716
use deno_graph::BuildOptions;
1817
use deno_graph::GraphKind;
1918
use deno_graph::ModuleGraph;
@@ -190,7 +189,7 @@ async fn run() -> anyhow::Result<()> {
190189
filter,
191190
private,
192191
} => {
193-
let doc_nodes_by_url = if json_input {
192+
let mut doc_nodes_by_url = if json_input {
194193
assert_eq!(files.len(), 1);
195194
serde_json::from_reader(std::fs::File::open(&files[0])?)?
196195
} else {
@@ -210,21 +209,26 @@ async fn run() -> anyhow::Result<()> {
210209
return Ok(());
211210
}
212211

213-
let mut doc_nodes =
214-
doc_nodes_by_url.into_values().flatten().collect::<Vec<_>>();
215-
216-
doc_nodes
217-
.retain(|doc_node| !matches!(doc_node.def, DocNodeDef::Import { .. }));
218-
219-
if let Some(filter) = filter {
220-
doc_nodes = find_nodes_by_name_recursively(doc_nodes, &filter);
212+
for (_, doc) in &mut doc_nodes_by_url {
213+
if let Some(filter) = &filter {
214+
let symbols = std::mem::take(&mut doc.symbols);
215+
doc.symbols = find_nodes_by_name_recursively(symbols, filter);
216+
}
221217
}
222218

223219
if json {
224-
serde_json::to_writer_pretty(std::io::stdout(), &doc_nodes)?;
220+
serde_json::to_writer_pretty(std::io::stdout(), &doc_nodes_by_url)?;
225221
println!();
226222
} else {
227-
let result = DocPrinter::new(&doc_nodes, true, false);
223+
let mut merged_doc = deno_doc::Document::default();
224+
for doc in doc_nodes_by_url.into_values() {
225+
if merged_doc.module_doc.is_empty() {
226+
merged_doc.module_doc = doc.module_doc;
227+
}
228+
merged_doc.symbols.extend(doc.symbols);
229+
}
230+
231+
let result = DocPrinter::new(&merged_doc, true, false);
228232
println!("{result}");
229233
}
230234
}
@@ -378,7 +382,7 @@ fn generate_docs_directory(
378382
package_name: Option<String>,
379383
output_dir: PathBuf,
380384
main_entrypoint: Option<ModuleSpecifier>,
381-
doc_nodes_by_url: IndexMap<ModuleSpecifier, Vec<deno_doc::DocNode>>,
385+
doc_nodes_by_url: IndexMap<ModuleSpecifier, deno_doc::Document>,
382386
) -> Result<(), anyhow::Error> {
383387
let cwd = current_dir().unwrap();
384388
let output_dir_resolved = cwd.join(output_dir);

js/mod.ts

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
22

33
import { instantiate } from "./deno_doc_wasm.generated.js";
4-
import type { DocNode, Location } from "./types.d.ts";
4+
import type { Document, Location } from "./types.d.ts";
55
import type { Page } from "./html_types.d.ts";
66
import { createCache } from "@deno/cache-dir";
77
import type { CacheSetting, LoadResponse } from "@deno/graph";
@@ -87,7 +87,7 @@ export interface DocOptions {
8787
export async function doc(
8888
specifiers: string[],
8989
options: DocOptions = {},
90-
): Promise<Record<string, Array<DocNode>>> {
90+
): Promise<Record<string, Document>> {
9191
const {
9292
load = createCache().load,
9393
includeAll = false,
@@ -128,6 +128,18 @@ export async function doc(
128128
);
129129
}
130130

131+
/**
132+
* Convert a v1 doc nodes array (flat array of doc nodes) to the v2
133+
* {@linkcode Document} format.
134+
*/
135+
export async function docnodesV1ToV2(
136+
// deno-lint-ignore no-explicit-any
137+
v1Nodes: any[],
138+
): Promise<Document> {
139+
const wasm = await instantiate();
140+
return wasm.docnodes_v1_to_v2(v1Nodes);
141+
}
142+
131143
export interface ShortPath {
132144
/** Name identifier for the path. */
133145
path: string;
@@ -303,12 +315,12 @@ const defaultUsageComposer: UsageComposer = {
303315
};
304316

305317
/**
306-
* Generate HTML files for provided {@linkcode DocNode}s.
318+
* Generate HTML files for provided {@linkcode Document}s.
307319
* @param docNodesByUrl DocNodes keyed by their absolute URL.
308320
* @param options Options for the generation.
309321
*/
310322
export async function generateHtml(
311-
docNodesByUrl: Record<string, Array<DocNode>>,
323+
docNodesByUrl: Record<string, Document>,
312324
options: GenerateOptions,
313325
): Promise<Record<string, string>> {
314326
const {
@@ -346,7 +358,7 @@ export async function generateHtml(
346358
* @param options Options for the generation.
347359
*/
348360
export async function generateHtmlAsJSON(
349-
docNodesByUrl: Record<string, Array<DocNode>>,
361+
docNodesByUrl: Record<string, Document>,
350362
options: GenerateOptions,
351363
): Promise<Record<string, Page>> {
352364
const {

js/test.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,24 @@ Deno.test({
99
const records = await doc(
1010
["https://deno.land/std@0.104.0/fmt/colors.ts"],
1111
);
12-
const entries = records["https://deno.land/std@0.104.0/fmt/colors.ts"];
13-
assertEquals(entries.length, 49);
14-
const fnStripColor = entries.find((n) =>
15-
n.kind === "function" && n.name === "stripColor"
12+
const document = records["https://deno.land/std@0.104.0/fmt/colors.ts"];
13+
assertEquals(document.symbols.length, 49);
14+
const fnStripColor = document.symbols.find((n) =>
15+
n.declarations.some((d) => d.kind === "function") &&
16+
n.name === "stripColor"
1617
);
1718
assert(fnStripColor, "unable to locate specific node");
18-
assert(fnStripColor.kind === "function");
19-
assert(fnStripColor.functionDef);
20-
assertEquals(fnStripColor.functionDef.params, [{
19+
const decl = fnStripColor.declarations[0];
20+
assert(decl.kind === "function");
21+
assert(decl.def);
22+
assertEquals(decl.def.params, [{
2123
kind: "identifier",
2224
name: "string",
2325
optional: false,
2426
tsType: {
2527
repr: "string",
2628
kind: "keyword",
27-
keyword: "string",
29+
value: "string",
2830
},
2931
}]);
3032
},
@@ -59,7 +61,7 @@ Deno.test({
5961
Deno.test({
6062
name: "doc() - with headers",
6163
async fn() {
62-
const entries = await doc(["https://example.com/a"], {
64+
const documents = await doc(["https://example.com/a"], {
6365
load(specifier) {
6466
return Promise.resolve({
6567
kind: "module",
@@ -73,7 +75,7 @@ Deno.test({
7375
});
7476
},
7577
});
76-
assertEquals(Object.values(entries)[0].length, 1);
78+
assertEquals(Object.values(documents)[0].symbols.length, 1);
7779
},
7880
});
7981

@@ -119,10 +121,10 @@ Deno.test({
119121
});
120122
},
121123
});
122-
const entries = Object.values(records)[0];
123-
assertEquals(entries.length, 1);
124-
assertEquals(entries[0].kind, "class");
125-
assertEquals(entries[0].name, "B");
124+
const document = Object.values(records)[0];
125+
assertEquals(document.symbols.length, 1);
126+
assertEquals(document.symbols[0].declarations[0].kind, "class");
127+
assertEquals(document.symbols[0].name, "B");
126128
},
127129
});
128130

0 commit comments

Comments
 (0)