Skip to content

Commit e5a0f7d

Browse files
devversionandrewseguin
authored andcommitted
docs: show inherited properties (#9299)
* Fixes that properties from mixins (e.g color, disabled) are not showing up in the docs. * No longer runs Dgeni twice when executing the docs task. Fixes #5284
1 parent acd9066 commit e5a0f7d

File tree

8 files changed

+52
-2
lines changed

8 files changed

+52
-2
lines changed

src/lib/core/common-behaviors/color.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {ElementRef} from '@angular/core';
1111

1212
/** @docs-private */
1313
export interface CanColor {
14+
/** Theme color palette for the component. */
1415
color: ThemePalette;
1516
}
1617

src/lib/core/common-behaviors/disable-ripple.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {Constructor} from './constructor';
1111

1212
/** @docs-private */
1313
export interface CanDisableRipple {
14+
/** Whether ripples are disabled. */
1415
disableRipple: boolean;
1516
}
1617

src/lib/core/common-behaviors/disabled.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {Constructor} from './constructor';
1111

1212
/** @docs-private */
1313
export interface CanDisable {
14+
/** Whether the component is disabled. */
1415
disabled: boolean;
1516
}
1617

src/lib/core/common-behaviors/tabindex.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {CanDisable} from './disabled';
1111

1212
/** @docs-private */
1313
export interface HasTabIndex {
14+
/** Tabindex of the component. */
1415
tabIndex: number;
1516
}
1617

tools/dgeni/index.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {Package} from 'dgeni';
22
import {DocsPrivateFilter} from './processors/docs-private-filter';
33
import {Categorizer} from './processors/categorizer';
44
import {FilterExportAliases} from './processors/filter-export-aliases';
5+
import {MergeInheritedProperties} from './processors/merge-inherited-properties';
56
import {ComponentGrouper} from './processors/component-grouper';
67
import {ReadTypeScriptModules} from 'dgeni-packages/typescript/processors/readTypeScriptModules';
78
import {TsParser} from 'dgeni-packages/typescript/services/TsParser';
@@ -51,6 +52,9 @@ export const apiDocsPackage = new Package('material2-api-docs', dgeniPackageDeps
5152
// Processor that filters out aliased exports that should not be shown in the docs.
5253
apiDocsPackage.processor(new FilterExportAliases());
5354

55+
// Processor that merges inherited properties of a class with the class doc.
56+
apiDocsPackage.processor(new MergeInheritedProperties());
57+
5458
// Processor that filters out symbols that should not be shown in the docs.
5559
apiDocsPackage.processor(new DocsPrivateFilter());
5660

@@ -99,8 +103,14 @@ apiDocsPackage.config((readTypeScriptModules: ReadTypeScriptModules, tsParser: T
99103
typescriptPathMap[`@angular/cdk/${packageName}`] = [`./cdk/${packageName}/index.ts`];
100104
});
101105

102-
tsParser.options.baseUrl = sourceDir;
106+
materialPackages.forEach(packageName => {
107+
typescriptPathMap[`@angular/material/${packageName}`] = [`./lib/${packageName}/index.ts`];
108+
});
109+
110+
// Add proper path mappings to the TSParser service of Dgeni. This ensures that properties
111+
// from mixins (e.g. color, disabled) are showing up properly in the docs.
103112
tsParser.options.paths = typescriptPathMap;
113+
tsParser.options.baseUrl = sourceDir;
104114

105115
// Entry points for docs generation. All publically exported symbols found through these
106116
// files will have docs generated.

tools/dgeni/processors/categorizer.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ export class Categorizer implements Processor {
114114
private decoratePropertyDoc(propertyDoc: CategorizedPropertyMemberDoc) {
115115
decorateDeprecatedDoc(propertyDoc);
116116

117+
// TODO(devversion): detect inputs based on the `inputs` property in the component metadata.
118+
117119
propertyDoc.isDirectiveInput = isDirectiveInput(propertyDoc);
118120
propertyDoc.directiveInputAlias = getDirectiveInputAlias(propertyDoc);
119121

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import {DocCollection, Processor} from 'dgeni';
2+
import {ClassExportDoc} from 'dgeni-packages/typescript/api-doc-types/ClassExportDoc';
3+
import {MemberDoc} from 'dgeni-packages/typescript/api-doc-types/MemberDoc';
4+
5+
/**
6+
* Processor that merges inherited properties of a class with the class doc. This is necessary
7+
* to properly show public properties from TypeScript mixin interfaces in the API.
8+
*/
9+
export class MergeInheritedProperties implements Processor {
10+
name = 'merge-inherited-properties';
11+
$runBefore = ['categorizer'];
12+
13+
$process(docs: DocCollection) {
14+
return docs
15+
.filter(doc => doc.docType === 'class')
16+
.forEach(doc => this.addInhertiedProperties(doc));
17+
}
18+
19+
private addInhertiedProperties(doc: ClassExportDoc) {
20+
doc.implementsClauses.filter(clause => clause.doc).forEach(clause => {
21+
clause.doc!.members.forEach(member => this.addMemberDocIfNotPresent(doc, member));
22+
});
23+
24+
doc.extendsClauses.filter(clause => clause.doc).forEach(clause => {
25+
clause.doc!.members.forEach(member => this.addMemberDocIfNotPresent(doc, member));
26+
});
27+
}
28+
29+
private addMemberDocIfNotPresent(destination: ClassExportDoc, memberDoc: MemberDoc) {
30+
if (!destination.members.find(member => member.name === memberDoc.name)) {
31+
destination.members.push(memberDoc);
32+
}
33+
}
34+
}

tools/gulp/tasks/docs.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ task('api-docs', () => {
150150
* Minifies all HTML files that have been generated. The HTML files for the
151151
* highlighted examples can be skipped, because it won't have any effect.
152152
*/
153-
task('minify-html-files', ['api-docs'], () => {
153+
task('minify-html-files', () => {
154154
return src('dist/docs/+(api|markdown)/**/*.html')
155155
.pipe(htmlmin(htmlMinifierOptions))
156156
.pipe(dest('dist/docs'));

0 commit comments

Comments
 (0)