Skip to content

Commit 8101620

Browse files
authored
Merge pull request #19 from schoero/feat/prevent-rendering-of-internals
feat: add option to exclude internal entities
2 parents 9999e04 + e73b846 commit 8101620

File tree

12 files changed

+277
-79
lines changed

12 files changed

+277
-79
lines changed

src/renderer/markup/ast-converter/entities/class.ts

+56-15
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
import { convertSeeTagsForDocumentation } from "unwritten:renderer/markup/ast-converter/shared/see";
22
import { registerAnchor, registerAnonymousAnchor } from "unwritten:renderer/markup/registry/registry";
33
import { renderMemberContext, withMemberContext } from "unwritten:renderer/markup/utils/context";
4+
import {
5+
implicitSignatureFilter,
6+
internalMemberFilter,
7+
privateMemberFilter
8+
} from "unwritten:renderer/markup/utils/filter";
49
import { isRenderObjectMemberTitlesEnabled, renderEntityPrefix } from "unwritten:renderer/markup/utils/renderer.js";
510
import { getRenderConfig } from "unwritten:renderer/utils/config";
6-
import { filterOutImplicitSignatures, filterOutPrivateMembers } from "unwritten:renderer/utils/private-members";
711
import {
812
convertEventPropertyEntityForDocumentation,
913
convertEventPropertyEntityForTableOfContents,
@@ -86,14 +90,33 @@ export function convertClassEntityForTableOfContents(ctx: MarkupRenderContext, c
8690
const getterEntities = extendClassEntityEntitiesWithHeritage(classEntity, "getters");
8791
const eventPropertyEntities = extendClassEntityEntitiesWithHeritage(classEntity, "events");
8892

89-
const publicConstructorEntity = renderConfig.renderPrivateMembers ? constructorEntity : constructorEntity && filterOutPrivateMembers([constructorEntity])[0];
90-
const publicPropertyEntities = renderConfig.renderPrivateMembers ? propertyEntities : filterOutPrivateMembers(propertyEntities);
91-
const publicMethodEntities = renderConfig.renderPrivateMembers ? methodEntities : filterOutPrivateMembers(methodEntities);
92-
const publicSetterEntities = renderConfig.renderPrivateMembers ? setterEntities : filterOutPrivateMembers(setterEntities);
93-
const publicGetterEntities = renderConfig.renderPrivateMembers ? getterEntities : filterOutPrivateMembers(getterEntities);
94-
const publicEventPropertyEntities = renderConfig.renderPrivateMembers ? eventPropertyEntities : filterOutPrivateMembers(eventPropertyEntities);
93+
const publicConstructorEntity = [constructorEntity]
94+
.filter(privateMemberFilter, ctx)
95+
.filter(internalMemberFilter, ctx)[0];
96+
97+
const publicPropertyEntities = propertyEntities
98+
.filter(privateMemberFilter, ctx)
99+
.filter(internalMemberFilter, ctx);
100+
101+
const publicMethodEntities = methodEntities
102+
.filter(privateMemberFilter, ctx)
103+
.filter(internalMemberFilter, ctx);
104+
105+
const publicSetterEntities = setterEntities
106+
.filter(privateMemberFilter, ctx)
107+
.filter(internalMemberFilter, ctx);
108+
109+
const publicGetterEntities = getterEntities
110+
.filter(privateMemberFilter, ctx)
111+
.filter(internalMemberFilter, ctx);
112+
113+
const publicEventPropertyEntities = eventPropertyEntities
114+
.filter(privateMemberFilter, ctx)
115+
.filter(internalMemberFilter, ctx);
116+
117+
const explicitConstructSignatures = publicConstructorEntity?.signatures
118+
?.filter(implicitSignatureFilter);
95119

96-
const explicitConstructSignatures = publicConstructorEntity?.signatures && filterOutImplicitSignatures(publicConstructorEntity.signatures);
97120
const convertedConstructSignatures = explicitConstructSignatures?.map(signatureEntity => convertSignatureEntityForTableOfContents(ctx, signatureEntity));
98121
const convertedProperties = publicPropertyEntities.map(propertyEntity => convertPropertyEntityForTableOfContents(ctx, propertyEntity));
99122
const convertedMethods = publicMethodEntities.flatMap(methodEntity => convertFunctionLikeEntityForTableOfContents(ctx, methodEntity)).flat();
@@ -189,14 +212,32 @@ export function convertClassEntityForDocumentation(ctx: MarkupRenderContext, cla
189212
const getterEntities = extendClassEntityEntitiesWithHeritage(classEntity, "getters");
190213
const eventPropertyEntities = extendClassEntityEntitiesWithHeritage(classEntity, "events");
191214

192-
const publicConstructorEntity = renderConfig.renderPrivateMembers ? constructorEntity : constructorEntity && filterOutPrivateMembers([constructorEntity])[0];
193-
const publicPropertyEntities = renderConfig.renderPrivateMembers ? propertyEntities : filterOutPrivateMembers(propertyEntities);
194-
const publicMethodEntities = renderConfig.renderPrivateMembers ? methodEntities : filterOutPrivateMembers(methodEntities);
195-
const publicSetterEntities = renderConfig.renderPrivateMembers ? setterEntities : filterOutPrivateMembers(setterEntities);
196-
const publicGetterEntities = renderConfig.renderPrivateMembers ? getterEntities : filterOutPrivateMembers(getterEntities);
197-
const publicEventPropertyEntities = renderConfig.renderPrivateMembers ? eventPropertyEntities : filterOutPrivateMembers(eventPropertyEntities);
215+
const publicConstructorEntity = [constructorEntity]
216+
.filter(privateMemberFilter, ctx)
217+
.filter(internalMemberFilter, ctx)[0];
218+
219+
const publicPropertyEntities = propertyEntities
220+
.filter(privateMemberFilter, ctx)
221+
.filter(internalMemberFilter, ctx);
222+
223+
const publicMethodEntities = methodEntities
224+
.filter(privateMemberFilter, ctx)
225+
.filter(internalMemberFilter, ctx);
226+
227+
const publicSetterEntities = setterEntities
228+
.filter(privateMemberFilter, ctx)
229+
.filter(internalMemberFilter, ctx);
230+
231+
const publicGetterEntities = getterEntities
232+
.filter(privateMemberFilter, ctx)
233+
.filter(internalMemberFilter, ctx);
234+
235+
const publicEventPropertyEntities = eventPropertyEntities
236+
.filter(privateMemberFilter, ctx)
237+
.filter(internalMemberFilter, ctx);
198238

199-
const explicitConstructSignatures = publicConstructorEntity?.signatures && filterOutImplicitSignatures(publicConstructorEntity.signatures);
239+
const explicitConstructSignatures = publicConstructorEntity?.signatures
240+
?.filter(implicitSignatureFilter);
200241

201242
const hasConstructSignatures = explicitConstructSignatures && explicitConstructSignatures.length > 0;
202243
const constructSignaturesTranslation = translate("constructSignature", { capitalizeEach: true, count: explicitConstructSignatures?.length });

src/renderer/markup/ast-converter/entities/function-like.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { filterOutImplicitSignatures } from "unwritten:renderer/utils/private-members";
1+
import { implicitSignatureFilter } from "unwritten:renderer/markup/utils/filter";
22
import {
33
convertSignatureEntityForDocumentation,
44
convertSignatureEntityForTableOfContents,
@@ -15,14 +15,14 @@ import type {
1515

1616

1717
export function convertFunctionLikeEntityForTableOfContents(ctx: MarkupRenderContext, functionLikeEntity: FunctionLikeEntity): ConvertedFunctionEntityForTableOfContents {
18-
const explicitSignatures = filterOutImplicitSignatures(functionLikeEntity.signatures);
18+
const explicitSignatures = functionLikeEntity.signatures.filter(implicitSignatureFilter);
1919
return explicitSignatures.map(
2020
signature => convertSignatureEntityForTableOfContents(ctx, signature)
2121
);
2222
}
2323

2424
export function convertFunctionLikeEntityForDocumentation(ctx: MarkupRenderContext, functionLikeEntity: FunctionLikeEntity): ConvertedFunctionEntityForDocumentation {
25-
const explicitSignatures = filterOutImplicitSignatures(functionLikeEntity.signatures);
25+
const explicitSignatures = functionLikeEntity.signatures.filter(implicitSignatureFilter);
2626
return explicitSignatures.map(
2727
signature => convertSignatureEntityForDocumentation(ctx, signature)
2828
);

src/renderer/markup/ast-converter/entities/interface.ts

+20-18
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { convertSeeTagsForDocumentation } from "unwritten:renderer/markup/ast-converter/shared/see";
22
import { registerAnchor } from "unwritten:renderer/markup/registry/registry";
33
import { renderMemberContext } from "unwritten:renderer/markup/utils/context";
4+
import {
5+
implicitSignatureFilter,
6+
internalMemberFilter,
7+
internalSignatureFilter,
8+
privateMemberFilter,
9+
privateSignatureFilter
10+
} from "unwritten:renderer/markup/utils/filter";
411
import { renderEntityPrefix } from "unwritten:renderer/markup/utils/renderer.js";
512
import { getRenderConfig } from "unwritten:renderer/utils/config";
6-
import {
7-
filterOutImplicitSignatures,
8-
filterOutPrivateMembers,
9-
filterOutPrivateSignatures
10-
} from "unwritten:renderer/utils/private-members";
1113
import {
1214
convertEventPropertyEntityForType,
1315
convertPropertyEntityForType,
@@ -106,19 +108,19 @@ export function convertInterfaceEntityForDocumentation(ctx: MarkupRenderContext,
106108
const setterSignatures = extendInterfaceEntitySignaturesWithHeritage(interfaceEntity, "setterSignatures");
107109
const getterSignatures = extendInterfaceEntitySignaturesWithHeritage(interfaceEntity, "getterSignatures");
108110

109-
const publicPropertyEntities = renderConfig.renderPrivateMembers ? propertyEntities : filterOutPrivateMembers(propertyEntities);
110-
const publicEventPropertyEntities = renderConfig.renderPrivateMembers ? eventPropertyEntities : filterOutPrivateMembers(eventPropertyEntities);
111-
const publicConstructSignatures = renderConfig.renderPrivateMembers ? constructSignatureEntities : filterOutPrivateSignatures(constructSignatureEntities);
112-
const publicCallSignatures = renderConfig.renderPrivateMembers ? callSignatureEntities : filterOutPrivateSignatures(callSignatureEntities);
113-
const publicMethodSignatures = renderConfig.renderPrivateMembers ? methodSignatures : filterOutPrivateSignatures(methodSignatures);
114-
const publicSetterSignatures = renderConfig.renderPrivateMembers ? setterSignatures : filterOutPrivateSignatures(setterSignatures);
115-
const publicGetterSignatures = renderConfig.renderPrivateMembers ? getterSignatures : filterOutPrivateSignatures(getterSignatures);
116-
117-
const explicitConstructSignatures = filterOutImplicitSignatures(publicConstructSignatures);
118-
const explicitCallSignatures = filterOutImplicitSignatures(publicCallSignatures);
119-
const explicitMethodSignatures = filterOutImplicitSignatures(publicMethodSignatures);
120-
const explicitSetterSignatures = filterOutImplicitSignatures(publicSetterSignatures);
121-
const explicitGetterSignatures = filterOutImplicitSignatures(publicGetterSignatures);
111+
const publicPropertyEntities = propertyEntities.filter(privateMemberFilter, ctx).filter(internalMemberFilter, ctx);
112+
const publicEventPropertyEntities = eventPropertyEntities.filter(privateMemberFilter, ctx).filter(internalMemberFilter, ctx);
113+
const publicConstructSignatures = constructSignatureEntities.filter(privateSignatureFilter, ctx).filter(internalSignatureFilter, ctx);
114+
const publicCallSignatures = callSignatureEntities.filter(privateSignatureFilter, ctx).filter(internalSignatureFilter, ctx);
115+
const publicMethodSignatures = methodSignatures.filter(privateSignatureFilter, ctx).filter(internalSignatureFilter, ctx);
116+
const publicSetterSignatures = setterSignatures.filter(privateSignatureFilter, ctx).filter(internalSignatureFilter, ctx);
117+
const publicGetterSignatures = getterSignatures.filter(privateSignatureFilter, ctx).filter(internalSignatureFilter, ctx);
118+
119+
const explicitConstructSignatures = publicConstructSignatures.filter(implicitSignatureFilter);
120+
const explicitCallSignatures = publicCallSignatures.filter(implicitSignatureFilter);
121+
const explicitMethodSignatures = publicMethodSignatures.filter(implicitSignatureFilter);
122+
const explicitSetterSignatures = publicSetterSignatures.filter(implicitSignatureFilter);
123+
const explicitGetterSignatures = publicGetterSignatures.filter(implicitSignatureFilter);
122124

123125
const properties = publicPropertyEntities.map(propertyEntity => convertPropertyEntityForType(ctx, propertyEntity));
124126
const eventProperties = publicEventPropertyEntities.map(eventPropertyEntity => convertEventPropertyEntityForType(ctx, eventPropertyEntity));

src/renderer/markup/ast-converter/entities/signature.test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { assert, expect, it } from "vitest";
22

33
import { createFunctionEntity, createVariableEntity } from "unwritten:interpreter/ast/entities/index";
4-
import { filterOutImplicitSignatures } from "unwritten:renderer/utils/private-members";
4+
import { implicitSignatureFilter } from "unwritten:renderer/markup/utils/filter";
55
import {
66
convertSignatureEntityForDocumentation,
77
convertSignatureEntityForTableOfContents
@@ -46,7 +46,7 @@ scope("MarkupRenderer", "Signature", () => {
4646

4747
const symbol = exportedSymbols.find(s => s.name === "testSignature")!;
4848
const functionEntity = createFunctionEntity(compilerContext, symbol);
49-
const signatureEntity = filterOutImplicitSignatures(functionEntity.signatures)[0];
49+
const signatureEntity = functionEntity.signatures.filter(implicitSignatureFilter)[0];
5050
const ctx = createRenderContext();
5151

5252
const convertedSignatureForTableOfContents = convertSignatureEntityForTableOfContents(ctx, signatureEntity);
@@ -156,7 +156,7 @@ scope("MarkupRenderer", "Signature", () => {
156156

157157
const symbol = exportedSymbols.find(s => s.name === "testSignature")!;
158158
const functionEntity = createFunctionEntity(compilerContext, symbol);
159-
const signatureEntity = filterOutImplicitSignatures(functionEntity.signatures)[0];
159+
const signatureEntity = functionEntity.signatures.filter(implicitSignatureFilter)[0];
160160
const ctx = createRenderContext();
161161

162162
const convertedSignatureForTableOfContents = convertSignatureEntityForTableOfContents(ctx, signatureEntity);

src/renderer/markup/ast-converter/index.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import { registerAnonymousAnchor } from "unwritten:renderer/markup/registry/registry";
22
import { getSectionType, pluralizeEntityKind } from "unwritten:renderer/markup/types-definitions/sections.js";
3+
import { filterExportableEntities } from "unwritten:renderer/markup/utils/filter";
4+
import { sortExportableEntities } from "unwritten:renderer/markup/utils/sort";
35
import {
46
convertCircularEntityToAnchor,
57
convertClassEntityForDocumentation,
@@ -35,7 +37,6 @@ import {
3537
} from "unwritten:renderer:markup/ast-converter/entities/index";
3638
import { createListNode, createSectionNode, createTitleNode } from "unwritten:renderer:markup/utils/nodes";
3739
import { renderCategoryName } from "unwritten:renderer:markup/utils/renderer";
38-
import { sortExportableEntities } from "unwritten:renderer:markup/utils/sort";
3940
import {
4041
isCircularEntity,
4142
isClassEntity,
@@ -156,9 +157,10 @@ export function convertEntityForDocumentation(ctx: MarkupRenderContext, entity:
156157
export function convertToMarkupAST(ctx: MarkupRenderContext, entities: ExportableEntity[]) {
157158

158159
const sortedEntities = sortExportableEntities(ctx, entities);
160+
const filteredEntities = filterExportableEntities(ctx, sortedEntities);
159161

160-
const tableOfContents = createTableOfContents(ctx, sortedEntities);
161-
const documentation = createDocumentation(ctx, sortedEntities);
162+
const tableOfContents = createTableOfContents(ctx, filteredEntities);
163+
const documentation = createDocumentation(ctx, filteredEntities);
162164

163165
return {
164166
documentation,

src/renderer/markup/ast-converter/types/object.ts

+13-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { TypeKind } from "unwritten:interpreter/enums/type";
2+
import {
3+
internalMemberFilter,
4+
internalSignatureFilter,
5+
privateMemberFilter,
6+
privateSignatureFilter
7+
} from "unwritten:renderer/markup/utils/filter";
28
import { getRenderConfig } from "unwritten:renderer/utils/config";
3-
import { filterOutPrivateMembers, filterOutPrivateSignatures } from "unwritten:renderer/utils/private-members";
49
import {
510
convertEventPropertyEntityForType,
611
convertFunctionLikeEntityForType,
@@ -46,13 +51,13 @@ export function convertObjectTypeMultiline(
4651

4752
const renderConfig = getRenderConfig(ctx);
4853

49-
const constructSignatures = renderConfig.renderPrivateMembers ? objectLikeType.constructSignatures : filterOutPrivateSignatures(objectLikeType.constructSignatures);
50-
const callSignatures = renderConfig.renderPrivateMembers ? objectLikeType.callSignatures : filterOutPrivateSignatures(objectLikeType.callSignatures);
51-
const properties = renderConfig.renderPrivateMembers ? objectLikeType.properties : filterOutPrivateMembers(objectLikeType.properties);
52-
const methods = renderConfig.renderPrivateMembers ? objectLikeType.methods : filterOutPrivateMembers(objectLikeType.methods);
53-
const setters = renderConfig.renderPrivateMembers ? objectLikeType.setters : filterOutPrivateMembers(objectLikeType.setters);
54-
const getters = renderConfig.renderPrivateMembers ? objectLikeType.getters : filterOutPrivateMembers(objectLikeType.getters);
55-
const events = renderConfig.renderPrivateMembers ? objectLikeType.events : filterOutPrivateMembers(objectLikeType.events);
54+
const constructSignatures = objectLikeType.constructSignatures.filter(privateSignatureFilter, ctx).filter(internalSignatureFilter, ctx);
55+
const callSignatures = objectLikeType.callSignatures.filter(privateSignatureFilter, ctx).filter(internalSignatureFilter, ctx);
56+
const properties = objectLikeType.properties.filter(privateMemberFilter, ctx).filter(internalMemberFilter, ctx);
57+
const methods = objectLikeType.methods.filter(privateMemberFilter, ctx).filter(internalMemberFilter, ctx);
58+
const setters = objectLikeType.setters.filter(privateMemberFilter, ctx).filter(internalMemberFilter, ctx);
59+
const getters = objectLikeType.getters.filter(privateMemberFilter, ctx).filter(internalMemberFilter, ctx);
60+
const events = objectLikeType.events.filter(privateMemberFilter, ctx).filter(internalMemberFilter, ctx);
5661

5762
const convertedConstructSignatures = constructSignatures.map(
5863
constructSignature => {

src/renderer/markup/config/config.test.ts

+87
Original file line numberDiff line numberDiff line change
@@ -205,4 +205,91 @@ scope("Renderer", "Config", () => {
205205

206206
});
207207

208+
describe("renderInternalEntities", async () => {
209+
210+
{
211+
212+
const testFileContent = ts`
213+
export class Class {
214+
/** @internal */
215+
public constructor() {}
216+
/** @internal */
217+
public property: number = 1;
218+
/** @internal */
219+
public method(): void {}
220+
}
221+
`;
222+
223+
const { ctx: compilerContext, exportedSymbols, fileSymbols } = compile(testFileContent);
224+
225+
const classSymbol = exportedSymbols.find(s => s.name === "Class")!;
226+
const classEntity = createClassEntity(compilerContext, classSymbol);
227+
228+
const ctx = createRenderContext();
229+
230+
{
231+
const convertedClassForDocumentation = convertClassEntityForDocumentation(ctx, classEntity);
232+
233+
const titleNode = convertedClassForDocumentation.title;
234+
235+
assert(isSectionNode(convertedClassForDocumentation));
236+
assert(isTitleNode(titleNode));
237+
238+
const [
239+
position,
240+
tags,
241+
description,
242+
remarks,
243+
example,
244+
constructSignatures,
245+
properties,
246+
methods,
247+
setters,
248+
getters
249+
] = titleNode.children;
250+
251+
it("should not have any internal members when disabled", () => {
252+
expect(constructSignatures).toBeFalsy();
253+
expect(properties).toBeFalsy();
254+
expect(methods).toBeFalsy();
255+
});
256+
257+
}
258+
259+
ctx.config.renderConfig.html.renderInternalEntities = true;
260+
261+
{
262+
const convertedClassForDocumentation = convertClassEntityForDocumentation(ctx, classEntity);
263+
264+
const titleNode = convertedClassForDocumentation.title;
265+
266+
assert(isSectionNode(convertedClassForDocumentation));
267+
assert(isTitleNode(titleNode));
268+
269+
const [
270+
position,
271+
tags,
272+
description,
273+
remarks,
274+
example,
275+
see,
276+
constructSignatures,
277+
properties,
278+
methods,
279+
setters,
280+
getters
281+
] = titleNode.children;
282+
283+
it("should have internal members when enabled", () => {
284+
expect(constructSignatures && constructSignatures.children).toHaveLength(1);
285+
expect(properties && properties.children.flat()).toHaveLength(1);
286+
expect(methods && methods.children.flat()).toHaveLength(1);
287+
});
288+
289+
}
290+
291+
}
292+
293+
});
294+
208295
});

src/renderer/markup/config/default.ts

+1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const defaultRenderConfig: Complete<MarkupRenderConfig> = {
1818
renderClassMemberTitles: "tableOfContents",
1919
renderDefaultValuesAsOptional: true,
2020
renderEntityPrefixes: "documentation",
21+
renderInternalEntities: false,
2122
renderOrder: [
2223
EntityKind.Module,
2324
EntityKind.Namespace,

src/renderer/markup/types-definitions/config.ts

+3
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ export interface MarkupRenderConfig {
4646
/** Defines whether the renderer should render private members. */
4747
renderPrivateMembers?: boolean;
4848

49+
/** Defines whether entities marked with an `@internal` tag should appear in the rendered output. */
50+
renderInternalEntities?: boolean;
51+
4952
/** Defines whether the renderer should render links to the source code. */
5053
renderSourceCodeLinks?: boolean;
5154

0 commit comments

Comments
 (0)