Skip to content

Commit 8436d3b

Browse files
committed
[doc] Extract type info and docs from .d.ts files by using typedoc
1 parent ed272fd commit 8436d3b

21 files changed

+801
-685
lines changed

docs/dts/Configuration.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/// <reference no-default-lib="true"/>
21
/// <reference path="./Event.d.ts" />
32
/// <reference path="./Message.d.ts" />
43
/// <reference path="./Output.d.ts" />

docs/dts/Event.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
/**
42
* _Event_ base interface.
53
*/

docs/dts/Hessian.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
declare interface Hessian {
42

53
/**

docs/dts/JSON.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
interface JSON {
42

53
/**

docs/dts/Message.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/// <reference no-default-lib="true"/>
21
/// <reference path="./Event.d.ts" />
32

43
/**

docs/dts/Netmask.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
/**
42
* IPv4 CIDR address block.
53
*/

docs/dts/Output.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
/// <reference no-default-lib="true"/>
2-
31
interface Output {
42
}

docs/dts/URL.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
interface URL {
42

53
/**

docs/dts/XML.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
/**
42
* Node in an XML document.
53
*/

docs/dts/algo.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
/**
42
* An ephemeral key-value storage that automatically cleans up old entries.
53
*/

docs/dts/console.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
interface Console {
42

53
/**

docs/dts/crypto.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
/**
42
* Public key in asymmetric cryptography.
53
*/

docs/dts/http.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/// <reference no-default-lib="true"/>
21
/// <reference path="./Message.d.ts" />
32

43
/**

docs/dts/logging.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
/**
42
* Logger base interface.
53
*/

docs/dts/os.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
interface Stats {
42
readonly dev: number;
53
readonly ino: number;

docs/dts/pipy.d.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
/// <reference no-default-lib="true"/>
21
/// <reference path="./Configuration.d.ts" />
32

43
/**

docs/dts/stats.d.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
/// <reference no-default-lib="true"/>
2-
31
/**
42
* Metric base interface.
53
*/

docs/dts/tsconfig.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"$schema": "http://json.schemastore.org/tsconfig",
3+
"compilerOptions": {
4+
"target": "es6",
5+
"module": "none",
6+
"noEmit": true,
7+
"noEmitHelpers": true,
8+
"downlevelIteration": false,
9+
"declaration": false,
10+
"sourceMap": false,
11+
"declarationMap": false,
12+
"types": [],
13+
"lib": [
14+
"ES2015",
15+
"ES2015.Core",
16+
"ES2015.Collection",
17+
"ES2016.Array.Include"
18+
]
19+
},
20+
"include": ["./*.d.ts"]
21+
}

gatsby-node.js

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
const fs = require('fs');
88
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
9+
const { Application, TypeDocReader, TSConfigReader } = require("typedoc");
910

1011
exports.onCreateWebpackConfig = ({
1112
actions,
@@ -43,6 +44,159 @@ exports.sourceNodes = ({ actions, createNodeId, createContentDigest }) => {
4344
},
4445
});
4546
}
47+
48+
const app = new Application();
49+
app.options.addReader(new TypeDocReader());
50+
app.options.addReader(new TSConfigReader());
51+
52+
app.bootstrap({
53+
tsconfig: `${__dirname}/docs/dts/tsconfig.json`,
54+
});
55+
56+
app.options.setValue('entryPoints', dtsFilenames);
57+
58+
const reflection = app.convert();
59+
const tree = app.serializer.toObject(reflection);
60+
const nodes = [];
61+
62+
const visitNode = (node, parent) => {
63+
switch (node.kindString) {
64+
case 'Variable':
65+
case 'Function':
66+
case 'Namespace':
67+
case 'Interface':
68+
case 'Method':
69+
case 'Property':
70+
nodes.push(node);
71+
break;
72+
}
73+
if (parent && parent.kindString === 'Namespace') node.namespace = parent.name;
74+
if (node.children) {
75+
for (const child of node.children) {
76+
visitNode(child, node);
77+
}
78+
}
79+
}
80+
81+
visitNode(tree, null);
82+
83+
const findNode = (kind, name) => nodes.find(i => i.kindString === kind && i.name == name);
84+
const findClassFromConstructor = (name) => findNode('Interface', name.substring(0, name.length - 11));
85+
86+
const namespaces = {};
87+
const classes = {};
88+
const functions = {};
89+
90+
for (const node of nodes) {
91+
if (node.kindString === 'Interface' && !node.name.endsWith('Constructor') && !node.name.endsWith('Options')) {
92+
if (node.children && node.children.length > 0 && !node.extendedBy) {
93+
classes[node.name] = node;
94+
}
95+
}
96+
}
97+
98+
for (const node of nodes) {
99+
if (node.kindString === 'Variable') {
100+
if (node.type.name.endsWith('Constructor')) {
101+
const classNode = findClassFromConstructor(node.type.name);
102+
classNode.constructorClass = findNode('Interface', node.type.name);
103+
classes[node.name] = classNode;
104+
} else {
105+
const namespaceNode = findNode('Interface', node.type.name);
106+
namespaces[node.name] = namespaceNode;
107+
delete classes[node.type.name];
108+
}
109+
} else if (node.kindString === 'Function') {
110+
let name = node.name;
111+
if (node.namespace) name = node.namespace + '.' + name;
112+
functions[name] = node;
113+
}
114+
}
115+
116+
const addNode = (name, data) => {
117+
const content = JSON.stringify(data);
118+
createNode({
119+
id: createNodeId(name),
120+
filename: name,
121+
parent: null,
122+
children: [],
123+
internal: {
124+
type: 'TypeDoc',
125+
mediaType: 'application/json',
126+
content,
127+
contentDigest: createContentDigest(content),
128+
},
129+
});
130+
}
131+
132+
const addClassMembers = (className, classNode) => {
133+
const children = classNode.children;
134+
if (children) {
135+
for (const child of classNode.children) {
136+
switch (child.kindString) {
137+
case 'Method':
138+
addNode(className + '.' + child.name + '()', child);
139+
break;
140+
case 'Property':
141+
addNode(className + '.' + child.name, child);
142+
break;
143+
}
144+
}
145+
}
146+
}
147+
148+
for (const name in namespaces) {
149+
const node = namespaces[name];
150+
addNode(name, node);
151+
for (const child of node.children) {
152+
if (child.kindString === 'Method') {
153+
addNode(name + '.' + child.name + '()', child);
154+
} else if (child.kindString === 'Property') {
155+
const type = child.type.name;
156+
if (type && type.endsWith('Constructor')) {
157+
const classNode = findClassFromConstructor(child.type.name);
158+
if (classNode) {
159+
classNode.constructorClass = findNode('Interface', child.type.name);
160+
addNode(name + '.' + child.name, classNode);
161+
addClassMembers(name + '.' + child.name, classNode);
162+
delete classes[classNode.name];
163+
}
164+
}
165+
}
166+
}
167+
}
168+
169+
for (const name in classes) {
170+
const node = classes[name];
171+
addNode(name, node);
172+
addClassMembers(name, node);
173+
const constructor = node.constructorClass;
174+
if (constructor) {
175+
for (const child of constructor.children) {
176+
switch (child.kindString) {
177+
case 'Constructor':
178+
addNode(name + '.new()', child);
179+
break;
180+
case 'Method':
181+
addNode(name + '.' + child.name + '()', child);
182+
break;
183+
}
184+
}
185+
}
186+
}
187+
188+
for (const name in functions) {
189+
const node = functions[name];
190+
addNode(name + '()', node);
191+
}
192+
193+
console.log('===== TypeDoc =====');
194+
console.log('Namespaces');
195+
for (const name in namespaces) console.log(' ', name);
196+
console.log('Classes');
197+
for (const name in classes) console.log(' ', name);
198+
console.log('Functions');
199+
for (const name in functions) console.log(' ', name);
46200
}
47201

48202
const LANGS = ['en', 'zh', 'jp'];

0 commit comments

Comments
 (0)