Skip to content

Commit b93f549

Browse files
committed
[api-extractor] Add readonlymixin
1 parent 038d87c commit b93f549

File tree

41 files changed

+783
-27
lines changed

Some content is hidden

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

41 files changed

+783
-27
lines changed

apps/api-documenter/src/documenters/MarkdownDocumenter.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ import {
4040
IResolveDeclarationReferenceResult,
4141
ApiTypeAlias,
4242
ExcerptToken,
43-
ApiOptionalMixin
43+
ApiOptionalMixin,
44+
ApiReadonlyMixin
4445
} from '@microsoft/api-extractor-model';
4546

4647
import { CustomDocNodes } from '../nodes/CustomDocNodeKind';
@@ -997,6 +998,15 @@ export class MarkdownDocumenter {
997998
new DocPlainText({ configuration, text: ' ' })
998999
]);
9991000
}
1001+
//Should this be under modifer or descriptions?
1002+
if (ApiReadonlyMixin.isBaseClassOf(apiItem) && apiItem.isReadonly) {
1003+
section.appendNodesInParagraph([
1004+
new DocEmphasisSpan({ configuration, italic: true }, [
1005+
new DocPlainText({ configuration, text: '[Readonly]' })
1006+
]),
1007+
new DocPlainText({ configuration, text: ' ' })
1008+
]);
1009+
}
10001010

10011011
if (apiItem instanceof ApiDocumentedItem) {
10021012
if (apiItem.tsdocComment !== undefined) {

apps/api-extractor/src/generators/ApiModelGenerator.ts

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -653,14 +653,16 @@ export class ApiModelGenerator {
653653
const apiItemMetadata: ApiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
654654
const docComment: tsdoc.DocComment | undefined = apiItemMetadata.tsdocComment;
655655
const releaseTag: ReleaseTag = apiItemMetadata.effectiveReleaseTag;
656+
const isReadonly: boolean = this._determineReadonly(astDeclaration);
656657

657658
apiInterface = new ApiInterface({
658659
name,
659660
docComment,
660661
releaseTag,
661662
excerptTokens,
662663
typeParameters,
663-
extendsTokenRanges
664+
extendsTokenRanges,
665+
isReadonly
664666
});
665667

666668
parentApiItem.addMember(apiInterface);
@@ -669,6 +671,15 @@ export class ApiModelGenerator {
669671
this._processChildDeclarations(astDeclaration, exportedName, apiInterface);
670672
}
671673

674+
private _determineReadonly(astDeclaration: AstDeclaration): boolean {
675+
const apiItemMetadata: ApiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
676+
const docComment: tsdoc.DocComment | undefined = apiItemMetadata.tsdocComment;
677+
const declarationMetadata: DeclarationMetadata = this._collector.fetchDeclarationMetadata(astDeclaration);
678+
return (astDeclaration.modifierFlags & ts.ModifierFlags.Readonly) !== 0
679+
|| (docComment !== undefined && docComment.modifierTagSet.hasTagName('@readonly'))
680+
|| (declarationMetadata.ancillaryDeclarations.length === 0 && astDeclaration.declaration.kind === ts.SyntaxKind.GetAccessor);
681+
}
682+
672683
private _processApiMethod(
673684
astDeclaration: AstDeclaration,
674685
exportedName: string | undefined,
@@ -709,6 +720,7 @@ export class ApiModelGenerator {
709720
}
710721
const isOptional: boolean =
711722
(astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
723+
const isReadonly: boolean = this._determineReadonly(astDeclaration);
712724

713725
apiMethod = new ApiMethod({
714726
name,
@@ -720,7 +732,8 @@ export class ApiModelGenerator {
720732
parameters,
721733
overloadIndex,
722734
excerptTokens,
723-
returnTypeTokenRange
735+
returnTypeTokenRange,
736+
isReadonly
724737
});
725738

726739
parentApiItem.addMember(apiMethod);
@@ -765,6 +778,7 @@ export class ApiModelGenerator {
765778
const releaseTag: ReleaseTag = apiItemMetadata.effectiveReleaseTag;
766779
const isOptional: boolean =
767780
(astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
781+
const isReadonly: boolean = this._determineReadonly(astDeclaration);
768782

769783
apiMethodSignature = new ApiMethodSignature({
770784
name,
@@ -775,7 +789,8 @@ export class ApiModelGenerator {
775789
parameters,
776790
overloadIndex,
777791
excerptTokens,
778-
returnTypeTokenRange
792+
returnTypeTokenRange,
793+
isReadonly
779794
});
780795

781796
parentApiItem.addMember(apiMethodSignature);
@@ -839,13 +854,15 @@ export class ApiModelGenerator {
839854
const releaseTag: ReleaseTag = apiItemMetadata.effectiveReleaseTag;
840855
const isOptional: boolean =
841856
(astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
857+
const isReadonly: boolean = this._determineReadonly(astDeclaration);
842858

843859
apiProperty = new ApiProperty({
844860
name,
845861
docComment,
846862
releaseTag,
847863
isStatic,
848864
isOptional,
865+
isReadonly,
849866
excerptTokens,
850867
propertyTypeTokenRange
851868
});
@@ -882,14 +899,16 @@ export class ApiModelGenerator {
882899
const releaseTag: ReleaseTag = apiItemMetadata.effectiveReleaseTag;
883900
const isOptional: boolean =
884901
(astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
902+
const isReadonly: boolean = this._determineReadonly(astDeclaration);
885903

886904
apiPropertySignature = new ApiPropertySignature({
887905
name,
888906
docComment,
889907
releaseTag,
890908
isOptional,
891909
excerptTokens,
892-
propertyTypeTokenRange
910+
propertyTypeTokenRange,
911+
isReadonly
893912
});
894913

895914
parentApiItem.addMember(apiPropertySignature);

0 commit comments

Comments
 (0)