@microsoft/api-extractor
Version:
Validatation, documentation, and auditing for the exported API of a TypeScript package
137 lines (135 loc) • 6.12 kB
JavaScript
/* tslint:disable:no-bitwise */
;
var __extends = (this && this.__extends) || (function () {
var extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
return function (d, b) {
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
var ts = require("typescript");
var ApiStructuredType_1 = require("./ApiStructuredType");
var ApiEnum_1 = require("./ApiEnum");
var ApiFunction_1 = require("./ApiFunction");
var ApiItem_1 = require("./ApiItem");
var ApiItemContainer_1 = require("./ApiItemContainer");
var TypeScriptHelpers_1 = require("../TypeScriptHelpers");
var PackageJsonHelpers_1 = require("../PackageJsonHelpers");
/**
* This class is part of the ApiItem abstract syntax tree. It represents the top-level
* exports for an Rush package. This object acts as the root of the Extractor's tree.
*/
var ApiPackage = (function (_super) {
__extends(ApiPackage, _super);
function ApiPackage(extractor, rootFile) {
var _this = _super.call(this, ApiPackage._getOptions(extractor, rootFile)) || this;
_this._exportedNormalizedSymbols = [];
_this.kind = ApiItem_1.ApiItemKind.Package;
// The scoped package name. (E.g. "@microsoft/api-extractor")
_this.name = PackageJsonHelpers_1.default.readPackageName(_this.extractor.packageFolder);
var exportSymbols = _this.typeChecker.getExportsOfModule(_this.declarationSymbol);
if (exportSymbols) {
for (var _i = 0, exportSymbols_1 = exportSymbols; _i < exportSymbols_1.length; _i++) {
var exportSymbol = exportSymbols_1[_i];
var followedSymbol = _this.followAliases(exportSymbol);
if (!followedSymbol.declarations) {
_this.reportWarning("Definition with no declarations: " + exportSymbol.name);
continue;
}
for (var _a = 0, _b = followedSymbol.declarations; _a < _b.length; _a++) {
var declaration = _b[_a];
var options = {
extractor: _this.extractor,
declaration: declaration,
declarationSymbol: followedSymbol,
jsdocNode: declaration,
exportSymbol: exportSymbol
};
if (followedSymbol.flags & (ts.SymbolFlags.Class | ts.SymbolFlags.Interface)) {
_this.addMemberItem(new ApiStructuredType_1.default(options));
}
else if (followedSymbol.flags & ts.SymbolFlags.Function) {
_this.addMemberItem(new ApiFunction_1.default(options));
}
else if (followedSymbol.flags & ts.SymbolFlags.Enum) {
_this.addMemberItem(new ApiEnum_1.default(options));
}
else {
_this.reportWarning("Unsupported export: " + exportSymbol.name);
}
}
_this._exportedNormalizedSymbols.push({
exportedName: exportSymbol.name,
followedSymbol: followedSymbol
});
}
}
return _this;
}
ApiPackage._getOptions = function (extractor, rootFile) {
var rootFileSymbol = TypeScriptHelpers_1.default.getSymbolForDeclaration(rootFile);
var statement;
var foundDescription = undefined;
for (var _i = 0, _a = rootFile.statements; _i < _a.length; _i++) {
var statementNode = _a[_i];
if (statementNode.kind === ts.SyntaxKind.VariableStatement) {
statement = statementNode;
for (var _b = 0, _c = statement.declarationList.declarations; _b < _c.length; _b++) {
var statementDeclaration = _c[_b];
if (statementDeclaration.name.getText() === 'packageDescription') {
foundDescription = statement;
}
}
}
}
return {
extractor: extractor,
declaration: rootFileSymbol.declarations[0],
declarationSymbol: rootFileSymbol,
jsdocNode: foundDescription
};
};
/**
* Finds and returns the original symbol name.
*
* For example, suppose a class is defined as "export default class MyClass { }"
* but exported from the package's index.ts like this:
*
* export { default as _MyClass } from './MyClass';
*
* In this example, given the symbol for _MyClass, getExportedSymbolName() will return
* the string "MyClass".
*/
ApiPackage.prototype.tryGetExportedSymbolName = function (symbol) {
var followedSymbol = this.followAliases(symbol);
for (var _i = 0, _a = this._exportedNormalizedSymbols; _i < _a.length; _i++) {
var exportedSymbol = _a[_i];
if (exportedSymbol.followedSymbol === followedSymbol) {
return exportedSymbol.exportedName;
}
}
return undefined;
};
/**
* Find a member in this package by name and return it if found.
*
* @param memberName - the name of the member ApiItem
*/
ApiPackage.prototype.getMemberItem = function (memberName) {
if (this.memberItems.has(memberName)) {
return this.memberItems.get(memberName);
}
return undefined;
};
ApiPackage.prototype.shouldHaveDocumentation = function () {
// We don't write JSDoc for the ApiPackage object
return false;
};
return ApiPackage;
}(ApiItemContainer_1.default));
exports.default = ApiPackage;
//# sourceMappingURL=ApiPackage.js.map