Skip to content

Commit 7c9d7d6

Browse files
author
Soc Sieng
committed
Render modules as namespaces
1 parent 95d40da commit 7c9d7d6

31 files changed

+270
-44
lines changed

src/render/container-renderer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import join from '../util/join';
66
import { propertySorter } from '../util/sort';
77

88
export default class ContainerRenderer extends ReflectionRenderer {
9-
private _type: string;
9+
protected _type: string;
1010

1111
constructor(type: string) {
1212
super();

src/render/module-renderer.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { DeclarationReflection, Reflection, ReflectionKind } from 'typedoc/dist/lib/models';
2+
import ContainerRenderer from './container-renderer';
3+
import join from '../util/join';
4+
5+
export default class ModuleRenderer extends ContainerRenderer {
6+
constructor() {
7+
super('module');
8+
}
9+
10+
public render(node: Reflection): string {
11+
if (this.isNamespace(node)) {
12+
let renderNode = node as DeclarationReflection;
13+
const nodeNames: string[] = [];
14+
let latestComment: string | undefined;
15+
let currentComment: string | undefined;
16+
17+
do {
18+
currentComment = this.renderComment(renderNode);
19+
20+
// cannot combine modules into namespace because comments differ
21+
if (latestComment && currentComment && latestComment !== currentComment) {
22+
break;
23+
}
24+
25+
if (currentComment) {
26+
latestComment = currentComment;
27+
}
28+
29+
nodeNames.push(renderNode.name);
30+
if (renderNode.children?.length === 1 && renderNode.children[0].kindOf(ReflectionKind.SomeModule)) {
31+
const nextNode = renderNode.children[0];
32+
const nextComment = this.renderComment(nextNode);
33+
34+
// cannot combine modules into namespace because comments differ
35+
if (latestComment && nextComment && latestComment !== nextComment) {
36+
break;
37+
}
38+
39+
renderNode = nextNode;
40+
} else {
41+
break;
42+
}
43+
} while (this.isNamespace(renderNode));
44+
45+
const lines: string[] = [];
46+
const declarationParts: string[] = [
47+
this.isTop(node) ? 'declare' : '',
48+
'namespace', `${nodeNames.join('.')}`
49+
];
50+
51+
if (latestComment) {
52+
this.pushIfTruthy(lines, latestComment);
53+
}
54+
55+
lines.push(join(' ', ...declarationParts, '{'));
56+
57+
const body = this.renderBody(renderNode);
58+
if (body) {
59+
lines.push(body);
60+
}
61+
62+
lines.push('}');
63+
64+
return lines.join('\n');
65+
}
66+
67+
return super.render(node);
68+
}
69+
70+
private isNamespace(node: Reflection) {
71+
const hasSpecialCharacterExpression = /[^\w]/;
72+
return !hasSpecialCharacterExpression.test(node.name);
73+
}
74+
}

src/render/renderers.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import FunctionRenderer from './function-renderer';
88
import GetSignatureRenderer from './get-signature-renderer';
99
import IndexSignatureRenderer from './index-signature-renderer';
1010
import MethodRenderer from './method-renderer';
11+
import ModuleRenderer from './module-renderer';
1112
import ObjectLiteralRenderer from './object-literal-renderer';
1213
import ParameterRenderer from './parameter-renderer';
1314
import ProjectRenderer from './project-renderer';
@@ -28,14 +29,14 @@ export const renderers: { [kind: number]: ReflectionRenderer } = {
2829
[ReflectionKind.Enum]: new ContainerRenderer('enum'),
2930
[ReflectionKind.EnumMember]: new EnumMemberRenderer(),
3031
[ReflectionKind.Event]: new EventRenderer(),
31-
[ReflectionKind.ExternalModule]: new ContainerRenderer('module'),
32+
[ReflectionKind.ExternalModule]: new ModuleRenderer(),
3233
[ReflectionKind.Function]: new FunctionRenderer(),
3334
[ReflectionKind.GetSignature]: new GetSignatureRenderer(),
3435
[ReflectionKind.Global]: new ProjectRenderer(),
3536
[ReflectionKind.IndexSignature]: new IndexSignatureRenderer(),
3637
[ReflectionKind.Interface]: new ContainerRenderer('interface'),
3738
[ReflectionKind.Method]: new MethodRenderer(),
38-
[ReflectionKind.Module]: new ContainerRenderer('module'),
39+
[ReflectionKind.Module]: new ModuleRenderer(),
3940
[ReflectionKind.ObjectLiteral]: new ObjectLiteralRenderer(),
4041
[ReflectionKind.Parameter]: new ParameterRenderer(),
4142
[ReflectionKind.Property]: new PropertyRenderer(),

tests/dynamic-tests.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ function createApplication(logOutput: string[]) {
4141
}
4242

4343
function normalizeWhitespace(input: string) {
44-
return input.replace(/^$\r?\n/gm, '').replace(/\s+/gm, '');
44+
return input.replace(/^$\r?\n/gm, '').replace(/\s+$/gm, '');
4545
}
4646

4747
describe('Dynamic test suite', () => {

tests/test-data/comments/exact.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
declare module CommentsTest {
1+
declare namespace CommentsTest {
22
/**
33
* This is the comment's short text
44
*

tests/test-data/export/exact.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/**
22
* Export test
33
*/
4-
declare module ExportTest {
4+
declare namespace ExportTest {
55
class ExportedClass {
66
private doSomethingPrivate(): void;
77

tests/test-data/function/destructuring-expected.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
declare module test {
1+
declare namespace test {
22
/**
33
* Adds many numbers together
44
*/

tests/test-data/function/destructuring-input.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export module test {
1+
export namespace test {
22
/**
33
* Adds many numbers together
44
*/

tests/test-data/function/expected.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
declare module test {
1+
declare namespace test {
22
/**
33
* Adds two numbers together
44
*/

tests/test-data/function/handler-exact.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
declare module Handlers {
1+
declare namespace Handlers {
22
type MyUncommentedHandler = (foo: any) => any;
33

44
/**

0 commit comments

Comments
 (0)