init
This commit is contained in:
		
							
								
								
									
										39
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,39 @@
 | 
			
		||||
import { ApiModel, ApiPackage } from '@microsoft/api-extractor-model';
 | 
			
		||||
import type { Collector } from '../collector/Collector';
 | 
			
		||||
export declare class ApiModelGenerator {
 | 
			
		||||
    private readonly _collector;
 | 
			
		||||
    private readonly _apiModel;
 | 
			
		||||
    private readonly _referenceGenerator;
 | 
			
		||||
    constructor(collector: Collector);
 | 
			
		||||
    get apiModel(): ApiModel;
 | 
			
		||||
    buildApiPackage(): ApiPackage;
 | 
			
		||||
    private _processAstEntity;
 | 
			
		||||
    private _processAstNamespaceImport;
 | 
			
		||||
    private _processDeclaration;
 | 
			
		||||
    private _processChildDeclarations;
 | 
			
		||||
    private _processApiCallSignature;
 | 
			
		||||
    private _processApiConstructor;
 | 
			
		||||
    private _processApiClass;
 | 
			
		||||
    private _processApiConstructSignature;
 | 
			
		||||
    private _processApiEnum;
 | 
			
		||||
    private _processApiEnumMember;
 | 
			
		||||
    private _processApiFunction;
 | 
			
		||||
    private _processApiIndexSignature;
 | 
			
		||||
    private _processApiInterface;
 | 
			
		||||
    private _processApiMethod;
 | 
			
		||||
    private _processApiMethodSignature;
 | 
			
		||||
    private _processApiNamespace;
 | 
			
		||||
    private _processApiProperty;
 | 
			
		||||
    private _processApiPropertySignature;
 | 
			
		||||
    private _processApiTypeAlias;
 | 
			
		||||
    private _processApiVariable;
 | 
			
		||||
    /**
 | 
			
		||||
     * @param nodesToCapture - A list of child nodes whose token ranges we want to capture
 | 
			
		||||
     */
 | 
			
		||||
    private _buildExcerptTokens;
 | 
			
		||||
    private _captureTypeParameters;
 | 
			
		||||
    private _captureParameters;
 | 
			
		||||
    private _isReadonly;
 | 
			
		||||
    private _getFileUrlPath;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=ApiModelGenerator.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"ApiModelGenerator.d.ts","sourceRoot":"","sources":["../../src/generators/ApiModelGenerator.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,QAAQ,EAER,UAAU,EAwBX,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAmBxD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAgC;gBAEjD,SAAS,EAAE,SAAS;IAMvC,IAAW,QAAQ,IAAI,QAAQ,CAE9B;IAEM,eAAe,IAAI,UAAU;IA8BpC,OAAO,CAAC,iBAAiB;IAiCzB,OAAO,CAAC,0BAA0B;IAoClC,OAAO,CAAC,mBAAmB;IAyF3B,OAAO,CAAC,yBAAyB;IASjC,OAAO,CAAC,wBAAwB;IAiDhC,OAAO,CAAC,sBAAsB;IAyC9B,OAAO,CAAC,gBAAgB;IAgExB,OAAO,CAAC,6BAA6B;IAoDrC,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,qBAAqB;IAsC7B,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,yBAAyB;IA6CjC,OAAO,CAAC,oBAAoB;IAyD5B,OAAO,CAAC,iBAAiB;IA2DzB,OAAO,CAAC,0BAA0B;IAuDlC,OAAO,CAAC,oBAAoB;IAgC5B,OAAO,CAAC,mBAAmB;IA+D3B,OAAO,CAAC,4BAA4B;IA8CpC,OAAO,CAAC,oBAAoB;IA4C5B,OAAO,CAAC,mBAAmB;IA6C3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,sBAAsB;IAuB9B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,WAAW;IA+BnB,OAAO,CAAC,eAAe;CAcxB"}
 | 
			
		||||
							
								
								
									
										814
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										814
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,814 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.ApiModelGenerator = void 0;
 | 
			
		||||
/* eslint-disable no-bitwise */
 | 
			
		||||
const path = __importStar(require("path"));
 | 
			
		||||
const ts = __importStar(require("typescript"));
 | 
			
		||||
const api_extractor_model_1 = require("@microsoft/api-extractor-model");
 | 
			
		||||
const node_core_library_1 = require("@rushstack/node-core-library");
 | 
			
		||||
const ExcerptBuilder_1 = require("./ExcerptBuilder");
 | 
			
		||||
const AstSymbol_1 = require("../analyzer/AstSymbol");
 | 
			
		||||
const DeclarationReferenceGenerator_1 = require("./DeclarationReferenceGenerator");
 | 
			
		||||
const AstNamespaceImport_1 = require("../analyzer/AstNamespaceImport");
 | 
			
		||||
const TypeScriptInternals_1 = require("../analyzer/TypeScriptInternals");
 | 
			
		||||
class ApiModelGenerator {
 | 
			
		||||
    constructor(collector) {
 | 
			
		||||
        this._collector = collector;
 | 
			
		||||
        this._apiModel = new api_extractor_model_1.ApiModel();
 | 
			
		||||
        this._referenceGenerator = new DeclarationReferenceGenerator_1.DeclarationReferenceGenerator(collector);
 | 
			
		||||
    }
 | 
			
		||||
    get apiModel() {
 | 
			
		||||
        return this._apiModel;
 | 
			
		||||
    }
 | 
			
		||||
    buildApiPackage() {
 | 
			
		||||
        const packageDocComment = this._collector.workingPackage.tsdocComment;
 | 
			
		||||
        const apiPackage = new api_extractor_model_1.ApiPackage({
 | 
			
		||||
            name: this._collector.workingPackage.name,
 | 
			
		||||
            docComment: packageDocComment,
 | 
			
		||||
            tsdocConfiguration: this._collector.extractorConfig.tsdocConfiguration,
 | 
			
		||||
            projectFolderUrl: this._collector.extractorConfig.projectFolderUrl
 | 
			
		||||
        });
 | 
			
		||||
        this._apiModel.addMember(apiPackage);
 | 
			
		||||
        const apiEntryPoint = new api_extractor_model_1.ApiEntryPoint({ name: '' });
 | 
			
		||||
        apiPackage.addMember(apiEntryPoint);
 | 
			
		||||
        for (const entity of this._collector.entities) {
 | 
			
		||||
            // Only process entities that are exported from the entry point. Entities that are exported from
 | 
			
		||||
            // `AstNamespaceImport` entities will be processed by `_processAstNamespaceImport`. However, if
 | 
			
		||||
            // we are including forgotten exports, then process everything.
 | 
			
		||||
            if (entity.exportedFromEntryPoint || this._collector.extractorConfig.docModelIncludeForgottenExports) {
 | 
			
		||||
                this._processAstEntity(entity.astEntity, {
 | 
			
		||||
                    name: entity.nameForEmit,
 | 
			
		||||
                    isExported: entity.exportedFromEntryPoint,
 | 
			
		||||
                    parentApiItem: apiEntryPoint
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return apiPackage;
 | 
			
		||||
    }
 | 
			
		||||
    _processAstEntity(astEntity, context) {
 | 
			
		||||
        if (astEntity instanceof AstSymbol_1.AstSymbol) {
 | 
			
		||||
            // Skip ancillary declarations; we will process them with the main declaration
 | 
			
		||||
            for (const astDeclaration of this._collector.getNonAncillaryDeclarations(astEntity)) {
 | 
			
		||||
                this._processDeclaration(astDeclaration, context);
 | 
			
		||||
            }
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        if (astEntity instanceof AstNamespaceImport_1.AstNamespaceImport) {
 | 
			
		||||
            // Note that a single API item can belong to two different AstNamespaceImport namespaces.  For example:
 | 
			
		||||
            //
 | 
			
		||||
            //   // file.ts defines "thing()"
 | 
			
		||||
            //   import * as example1 from "./file";
 | 
			
		||||
            //   import * as example2 from "./file";
 | 
			
		||||
            //
 | 
			
		||||
            //   // ...so here we end up with example1.thing() and example2.thing()
 | 
			
		||||
            //   export { example1, example2 }
 | 
			
		||||
            //
 | 
			
		||||
            // The current logic does not try to associate "thing()" with a specific parent.  Instead
 | 
			
		||||
            // the API documentation will show duplicated entries for example1.thing() and example2.thing().
 | 
			
		||||
            //
 | 
			
		||||
            // This could be improved in the future, but it requires a stable mechanism for choosing an associated parent.
 | 
			
		||||
            // For thoughts about this:  https://github.com/microsoft/rushstack/issues/1308
 | 
			
		||||
            this._processAstNamespaceImport(astEntity, context);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        // TODO: Figure out how to represent reexported AstImport objects.  Basically we need to introduce a new
 | 
			
		||||
        // ApiItem subclass for "export alias", similar to a type alias, but representing declarations of the
 | 
			
		||||
        // form "export { X } from 'external-package'".  We can also use this to solve GitHub issue #950.
 | 
			
		||||
    }
 | 
			
		||||
    _processAstNamespaceImport(astNamespaceImport, context) {
 | 
			
		||||
        const astModule = astNamespaceImport.astModule;
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiNamespace.getContainerKey(name);
 | 
			
		||||
        const fileUrlPath = this._getFileUrlPath(astNamespaceImport.declaration);
 | 
			
		||||
        let apiNamespace = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiNamespace === undefined) {
 | 
			
		||||
            apiNamespace = new api_extractor_model_1.ApiNamespace({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment: undefined,
 | 
			
		||||
                releaseTag: api_extractor_model_1.ReleaseTag.None,
 | 
			
		||||
                excerptTokens: [],
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiNamespace);
 | 
			
		||||
        }
 | 
			
		||||
        astModule.astModuleExportInfo.exportedLocalEntities.forEach((exportedEntity, exportedName) => {
 | 
			
		||||
            this._processAstEntity(exportedEntity, {
 | 
			
		||||
                name: exportedName,
 | 
			
		||||
                isExported: true,
 | 
			
		||||
                parentApiItem: apiNamespace
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    _processDeclaration(astDeclaration, context) {
 | 
			
		||||
        if ((astDeclaration.modifierFlags & ts.ModifierFlags.Private) !== 0) {
 | 
			
		||||
            return; // trim out private declarations
 | 
			
		||||
        }
 | 
			
		||||
        const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
        const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
        if (releaseTag === api_extractor_model_1.ReleaseTag.Internal) {
 | 
			
		||||
            return; // trim out items marked as "@internal"
 | 
			
		||||
        }
 | 
			
		||||
        switch (astDeclaration.declaration.kind) {
 | 
			
		||||
            case ts.SyntaxKind.CallSignature:
 | 
			
		||||
                this._processApiCallSignature(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.Constructor:
 | 
			
		||||
                this._processApiConstructor(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ConstructSignature:
 | 
			
		||||
                this._processApiConstructSignature(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ClassDeclaration:
 | 
			
		||||
                this._processApiClass(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.EnumDeclaration:
 | 
			
		||||
                this._processApiEnum(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.EnumMember:
 | 
			
		||||
                this._processApiEnumMember(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.FunctionDeclaration:
 | 
			
		||||
                this._processApiFunction(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.GetAccessor:
 | 
			
		||||
                this._processApiProperty(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.SetAccessor:
 | 
			
		||||
                this._processApiProperty(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.IndexSignature:
 | 
			
		||||
                this._processApiIndexSignature(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.InterfaceDeclaration:
 | 
			
		||||
                this._processApiInterface(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.MethodDeclaration:
 | 
			
		||||
                this._processApiMethod(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.MethodSignature:
 | 
			
		||||
                this._processApiMethodSignature(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ModuleDeclaration:
 | 
			
		||||
                this._processApiNamespace(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.PropertyDeclaration:
 | 
			
		||||
                this._processApiProperty(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.PropertySignature:
 | 
			
		||||
                this._processApiPropertySignature(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.TypeAliasDeclaration:
 | 
			
		||||
                this._processApiTypeAlias(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.VariableDeclaration:
 | 
			
		||||
                this._processApiVariable(astDeclaration, context);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
            // ignore unknown types
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processChildDeclarations(astDeclaration, context) {
 | 
			
		||||
        for (const childDeclaration of astDeclaration.children) {
 | 
			
		||||
            this._processDeclaration(childDeclaration, Object.assign(Object.assign({}, context), { name: childDeclaration.astSymbol.localName }));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiCallSignature(astDeclaration, context) {
 | 
			
		||||
        const { parentApiItem } = context;
 | 
			
		||||
        const overloadIndex = this._collector.getOverloadIndex(astDeclaration);
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiCallSignature.getContainerKey(overloadIndex);
 | 
			
		||||
        let apiCallSignature = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiCallSignature === undefined) {
 | 
			
		||||
            const callSignature = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const returnTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: callSignature.type, tokenRange: returnTypeTokenRange });
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, callSignature.typeParameters);
 | 
			
		||||
            const parameters = this._captureParameters(nodesToCapture, callSignature.parameters);
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(callSignature);
 | 
			
		||||
            apiCallSignature = new api_extractor_model_1.ApiCallSignature({
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                parameters,
 | 
			
		||||
                overloadIndex,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                returnTypeTokenRange,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiCallSignature);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiConstructor(astDeclaration, context) {
 | 
			
		||||
        const { parentApiItem } = context;
 | 
			
		||||
        const overloadIndex = this._collector.getOverloadIndex(astDeclaration);
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiConstructor.getContainerKey(overloadIndex);
 | 
			
		||||
        let apiConstructor = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiConstructor === undefined) {
 | 
			
		||||
            const constructorDeclaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const parameters = this._captureParameters(nodesToCapture, constructorDeclaration.parameters);
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const isProtected = (astDeclaration.modifierFlags & ts.ModifierFlags.Protected) !== 0;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(constructorDeclaration);
 | 
			
		||||
            apiConstructor = new api_extractor_model_1.ApiConstructor({
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                isProtected,
 | 
			
		||||
                parameters,
 | 
			
		||||
                overloadIndex,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiConstructor);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiClass(astDeclaration, context) {
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiClass.getContainerKey(name);
 | 
			
		||||
        let apiClass = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiClass === undefined) {
 | 
			
		||||
            const classDeclaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, classDeclaration.typeParameters);
 | 
			
		||||
            let extendsTokenRange = undefined;
 | 
			
		||||
            const implementsTokenRanges = [];
 | 
			
		||||
            for (const heritageClause of classDeclaration.heritageClauses || []) {
 | 
			
		||||
                if (heritageClause.token === ts.SyntaxKind.ExtendsKeyword) {
 | 
			
		||||
                    extendsTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                    if (heritageClause.types.length > 0) {
 | 
			
		||||
                        nodesToCapture.push({ node: heritageClause.types[0], tokenRange: extendsTokenRange });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else if (heritageClause.token === ts.SyntaxKind.ImplementsKeyword) {
 | 
			
		||||
                    for (const heritageType of heritageClause.types) {
 | 
			
		||||
                        const implementsTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                        implementsTokenRanges.push(implementsTokenRange);
 | 
			
		||||
                        nodesToCapture.push({ node: heritageType, tokenRange: implementsTokenRange });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const isAbstract = (ts.getCombinedModifierFlags(classDeclaration) & ts.ModifierFlags.Abstract) !== 0;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(classDeclaration);
 | 
			
		||||
            apiClass = new api_extractor_model_1.ApiClass({
 | 
			
		||||
                name,
 | 
			
		||||
                isAbstract,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                extendsTokenRange,
 | 
			
		||||
                implementsTokenRanges,
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiClass);
 | 
			
		||||
        }
 | 
			
		||||
        this._processChildDeclarations(astDeclaration, Object.assign(Object.assign({}, context), { parentApiItem: apiClass }));
 | 
			
		||||
    }
 | 
			
		||||
    _processApiConstructSignature(astDeclaration, context) {
 | 
			
		||||
        const { parentApiItem } = context;
 | 
			
		||||
        const overloadIndex = this._collector.getOverloadIndex(astDeclaration);
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiConstructSignature.getContainerKey(overloadIndex);
 | 
			
		||||
        let apiConstructSignature = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiConstructSignature === undefined) {
 | 
			
		||||
            const constructSignature = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const returnTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: constructSignature.type, tokenRange: returnTypeTokenRange });
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, constructSignature.typeParameters);
 | 
			
		||||
            const parameters = this._captureParameters(nodesToCapture, constructSignature.parameters);
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(constructSignature);
 | 
			
		||||
            apiConstructSignature = new api_extractor_model_1.ApiConstructSignature({
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                parameters,
 | 
			
		||||
                overloadIndex,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                returnTypeTokenRange,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiConstructSignature);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiEnum(astDeclaration, context) {
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiEnum.getContainerKey(name);
 | 
			
		||||
        let apiEnum = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiEnum === undefined) {
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, []);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const preserveMemberOrder = this._collector.extractorConfig.enumMemberOrder === api_extractor_model_1.EnumMemberOrder.Preserve;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(astDeclaration.declaration);
 | 
			
		||||
            apiEnum = new api_extractor_model_1.ApiEnum({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                preserveMemberOrder,
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiEnum);
 | 
			
		||||
        }
 | 
			
		||||
        this._processChildDeclarations(astDeclaration, Object.assign(Object.assign({}, context), { parentApiItem: apiEnum }));
 | 
			
		||||
    }
 | 
			
		||||
    _processApiEnumMember(astDeclaration, context) {
 | 
			
		||||
        const { name, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiEnumMember.getContainerKey(name);
 | 
			
		||||
        let apiEnumMember = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiEnumMember === undefined) {
 | 
			
		||||
            const enumMember = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            let initializerTokenRange = undefined;
 | 
			
		||||
            if (enumMember.initializer) {
 | 
			
		||||
                initializerTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                nodesToCapture.push({ node: enumMember.initializer, tokenRange: initializerTokenRange });
 | 
			
		||||
            }
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(enumMember);
 | 
			
		||||
            apiEnumMember = new api_extractor_model_1.ApiEnumMember({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                initializerTokenRange,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiEnumMember);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiFunction(astDeclaration, context) {
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const overloadIndex = this._collector.getOverloadIndex(astDeclaration);
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiFunction.getContainerKey(name, overloadIndex);
 | 
			
		||||
        let apiFunction = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiFunction === undefined) {
 | 
			
		||||
            const functionDeclaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const returnTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: functionDeclaration.type, tokenRange: returnTypeTokenRange });
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, functionDeclaration.typeParameters);
 | 
			
		||||
            const parameters = this._captureParameters(nodesToCapture, functionDeclaration.parameters);
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(functionDeclaration);
 | 
			
		||||
            apiFunction = new api_extractor_model_1.ApiFunction({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                parameters,
 | 
			
		||||
                overloadIndex,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                returnTypeTokenRange,
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiFunction);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiIndexSignature(astDeclaration, context) {
 | 
			
		||||
        const { parentApiItem } = context;
 | 
			
		||||
        const overloadIndex = this._collector.getOverloadIndex(astDeclaration);
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiIndexSignature.getContainerKey(overloadIndex);
 | 
			
		||||
        let apiIndexSignature = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiIndexSignature === undefined) {
 | 
			
		||||
            const indexSignature = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const returnTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: indexSignature.type, tokenRange: returnTypeTokenRange });
 | 
			
		||||
            const parameters = this._captureParameters(nodesToCapture, indexSignature.parameters);
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const isReadonly = this._isReadonly(astDeclaration);
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(indexSignature);
 | 
			
		||||
            apiIndexSignature = new api_extractor_model_1.ApiIndexSignature({
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                parameters,
 | 
			
		||||
                overloadIndex,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                returnTypeTokenRange,
 | 
			
		||||
                isReadonly,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiIndexSignature);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiInterface(astDeclaration, context) {
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiInterface.getContainerKey(name);
 | 
			
		||||
        let apiInterface = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiInterface === undefined) {
 | 
			
		||||
            const interfaceDeclaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, interfaceDeclaration.typeParameters);
 | 
			
		||||
            const extendsTokenRanges = [];
 | 
			
		||||
            for (const heritageClause of interfaceDeclaration.heritageClauses || []) {
 | 
			
		||||
                if (heritageClause.token === ts.SyntaxKind.ExtendsKeyword) {
 | 
			
		||||
                    for (const heritageType of heritageClause.types) {
 | 
			
		||||
                        const extendsTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                        extendsTokenRanges.push(extendsTokenRange);
 | 
			
		||||
                        nodesToCapture.push({ node: heritageType, tokenRange: extendsTokenRange });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(interfaceDeclaration);
 | 
			
		||||
            apiInterface = new api_extractor_model_1.ApiInterface({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                extendsTokenRanges,
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiInterface);
 | 
			
		||||
        }
 | 
			
		||||
        this._processChildDeclarations(astDeclaration, Object.assign(Object.assign({}, context), { parentApiItem: apiInterface }));
 | 
			
		||||
    }
 | 
			
		||||
    _processApiMethod(astDeclaration, context) {
 | 
			
		||||
        const { name, parentApiItem } = context;
 | 
			
		||||
        const isStatic = (astDeclaration.modifierFlags & ts.ModifierFlags.Static) !== 0;
 | 
			
		||||
        const overloadIndex = this._collector.getOverloadIndex(astDeclaration);
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiMethod.getContainerKey(name, isStatic, overloadIndex);
 | 
			
		||||
        let apiMethod = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiMethod === undefined) {
 | 
			
		||||
            const methodDeclaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const returnTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: methodDeclaration.type, tokenRange: returnTypeTokenRange });
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, methodDeclaration.typeParameters);
 | 
			
		||||
            const parameters = this._captureParameters(nodesToCapture, methodDeclaration.parameters);
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            if (releaseTag === api_extractor_model_1.ReleaseTag.Internal || releaseTag === api_extractor_model_1.ReleaseTag.Alpha) {
 | 
			
		||||
                return; // trim out items marked as "@internal" or "@alpha"
 | 
			
		||||
            }
 | 
			
		||||
            const isOptional = (astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
 | 
			
		||||
            const isProtected = (astDeclaration.modifierFlags & ts.ModifierFlags.Protected) !== 0;
 | 
			
		||||
            const isAbstract = (astDeclaration.modifierFlags & ts.ModifierFlags.Abstract) !== 0;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(methodDeclaration);
 | 
			
		||||
            apiMethod = new api_extractor_model_1.ApiMethod({
 | 
			
		||||
                name,
 | 
			
		||||
                isAbstract,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                isProtected,
 | 
			
		||||
                isStatic,
 | 
			
		||||
                isOptional,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                parameters,
 | 
			
		||||
                overloadIndex,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                returnTypeTokenRange,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiMethod);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiMethodSignature(astDeclaration, context) {
 | 
			
		||||
        const { name, parentApiItem } = context;
 | 
			
		||||
        const overloadIndex = this._collector.getOverloadIndex(astDeclaration);
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiMethodSignature.getContainerKey(name, overloadIndex);
 | 
			
		||||
        let apiMethodSignature = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiMethodSignature === undefined) {
 | 
			
		||||
            const methodSignature = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const returnTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: methodSignature.type, tokenRange: returnTypeTokenRange });
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, methodSignature.typeParameters);
 | 
			
		||||
            const parameters = this._captureParameters(nodesToCapture, methodSignature.parameters);
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const isOptional = (astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(methodSignature);
 | 
			
		||||
            apiMethodSignature = new api_extractor_model_1.ApiMethodSignature({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                isOptional,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                parameters,
 | 
			
		||||
                overloadIndex,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                returnTypeTokenRange,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiMethodSignature);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiNamespace(astDeclaration, context) {
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiNamespace.getContainerKey(name);
 | 
			
		||||
        let apiNamespace = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiNamespace === undefined) {
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, []);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(astDeclaration.declaration);
 | 
			
		||||
            apiNamespace = new api_extractor_model_1.ApiNamespace({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiNamespace);
 | 
			
		||||
        }
 | 
			
		||||
        this._processChildDeclarations(astDeclaration, Object.assign(Object.assign({}, context), { parentApiItem: apiNamespace }));
 | 
			
		||||
    }
 | 
			
		||||
    _processApiProperty(astDeclaration, context) {
 | 
			
		||||
        const { name, parentApiItem } = context;
 | 
			
		||||
        const isStatic = (astDeclaration.modifierFlags & ts.ModifierFlags.Static) !== 0;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiProperty.getContainerKey(name, isStatic);
 | 
			
		||||
        let apiProperty = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiProperty === undefined) {
 | 
			
		||||
            const declaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const propertyTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            let propertyTypeNode;
 | 
			
		||||
            if (ts.isPropertyDeclaration(declaration) || ts.isGetAccessorDeclaration(declaration)) {
 | 
			
		||||
                propertyTypeNode = declaration.type;
 | 
			
		||||
            }
 | 
			
		||||
            if (ts.isSetAccessorDeclaration(declaration)) {
 | 
			
		||||
                // Note that TypeScript always reports an error if a setter does not have exactly one parameter.
 | 
			
		||||
                propertyTypeNode = declaration.parameters[0].type;
 | 
			
		||||
            }
 | 
			
		||||
            nodesToCapture.push({ node: propertyTypeNode, tokenRange: propertyTypeTokenRange });
 | 
			
		||||
            let initializerTokenRange = undefined;
 | 
			
		||||
            if (ts.isPropertyDeclaration(declaration) && declaration.initializer) {
 | 
			
		||||
                initializerTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                nodesToCapture.push({ node: declaration.initializer, tokenRange: initializerTokenRange });
 | 
			
		||||
            }
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const isOptional = (astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
 | 
			
		||||
            const isProtected = (astDeclaration.modifierFlags & ts.ModifierFlags.Protected) !== 0;
 | 
			
		||||
            const isAbstract = (astDeclaration.modifierFlags & ts.ModifierFlags.Abstract) !== 0;
 | 
			
		||||
            const isReadonly = this._isReadonly(astDeclaration);
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(declaration);
 | 
			
		||||
            apiProperty = new api_extractor_model_1.ApiProperty({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                isAbstract,
 | 
			
		||||
                isProtected,
 | 
			
		||||
                isStatic,
 | 
			
		||||
                isOptional,
 | 
			
		||||
                isReadonly,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                propertyTypeTokenRange,
 | 
			
		||||
                initializerTokenRange,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiProperty);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            // If the property was already declared before (via a merged interface declaration),
 | 
			
		||||
            // we assume its signature is identical, because the language requires that.
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiPropertySignature(astDeclaration, context) {
 | 
			
		||||
        const { name, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiPropertySignature.getContainerKey(name);
 | 
			
		||||
        let apiPropertySignature = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiPropertySignature === undefined) {
 | 
			
		||||
            const propertySignature = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const propertyTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: propertySignature.type, tokenRange: propertyTypeTokenRange });
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const isOptional = (astDeclaration.astSymbol.followedSymbol.flags & ts.SymbolFlags.Optional) !== 0;
 | 
			
		||||
            const isReadonly = this._isReadonly(astDeclaration);
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(propertySignature);
 | 
			
		||||
            apiPropertySignature = new api_extractor_model_1.ApiPropertySignature({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                isOptional,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                propertyTypeTokenRange,
 | 
			
		||||
                isReadonly,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiPropertySignature);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            // If the property was already declared before (via a merged interface declaration),
 | 
			
		||||
            // we assume its signature is identical, because the language requires that.
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiTypeAlias(astDeclaration, context) {
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiTypeAlias.getContainerKey(name);
 | 
			
		||||
        let apiTypeAlias = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiTypeAlias === undefined) {
 | 
			
		||||
            const typeAliasDeclaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const typeParameters = this._captureTypeParameters(nodesToCapture, typeAliasDeclaration.typeParameters);
 | 
			
		||||
            const typeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: typeAliasDeclaration.type, tokenRange: typeTokenRange });
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(typeAliasDeclaration);
 | 
			
		||||
            apiTypeAlias = new api_extractor_model_1.ApiTypeAlias({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                typeParameters,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                typeTokenRange,
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiTypeAlias);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _processApiVariable(astDeclaration, context) {
 | 
			
		||||
        const { name, isExported, parentApiItem } = context;
 | 
			
		||||
        const containerKey = api_extractor_model_1.ApiVariable.getContainerKey(name);
 | 
			
		||||
        let apiVariable = parentApiItem.tryGetMemberByKey(containerKey);
 | 
			
		||||
        if (apiVariable === undefined) {
 | 
			
		||||
            const variableDeclaration = astDeclaration.declaration;
 | 
			
		||||
            const nodesToCapture = [];
 | 
			
		||||
            const variableTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: variableDeclaration.type, tokenRange: variableTypeTokenRange });
 | 
			
		||||
            let initializerTokenRange = undefined;
 | 
			
		||||
            if (variableDeclaration.initializer) {
 | 
			
		||||
                initializerTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                nodesToCapture.push({ node: variableDeclaration.initializer, tokenRange: initializerTokenRange });
 | 
			
		||||
            }
 | 
			
		||||
            const excerptTokens = this._buildExcerptTokens(astDeclaration, nodesToCapture);
 | 
			
		||||
            const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
            const releaseTag = apiItemMetadata.effectiveReleaseTag;
 | 
			
		||||
            const isReadonly = this._isReadonly(astDeclaration);
 | 
			
		||||
            const fileUrlPath = this._getFileUrlPath(variableDeclaration);
 | 
			
		||||
            apiVariable = new api_extractor_model_1.ApiVariable({
 | 
			
		||||
                name,
 | 
			
		||||
                docComment,
 | 
			
		||||
                releaseTag,
 | 
			
		||||
                excerptTokens,
 | 
			
		||||
                variableTypeTokenRange,
 | 
			
		||||
                initializerTokenRange,
 | 
			
		||||
                isReadonly,
 | 
			
		||||
                isExported,
 | 
			
		||||
                fileUrlPath
 | 
			
		||||
            });
 | 
			
		||||
            parentApiItem.addMember(apiVariable);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * @param nodesToCapture - A list of child nodes whose token ranges we want to capture
 | 
			
		||||
     */
 | 
			
		||||
    _buildExcerptTokens(astDeclaration, nodesToCapture) {
 | 
			
		||||
        const excerptTokens = [];
 | 
			
		||||
        // Build the main declaration
 | 
			
		||||
        ExcerptBuilder_1.ExcerptBuilder.addDeclaration(excerptTokens, astDeclaration, nodesToCapture, this._referenceGenerator);
 | 
			
		||||
        const declarationMetadata = this._collector.fetchDeclarationMetadata(astDeclaration);
 | 
			
		||||
        // Add any ancillary declarations
 | 
			
		||||
        for (const ancillaryDeclaration of declarationMetadata.ancillaryDeclarations) {
 | 
			
		||||
            ExcerptBuilder_1.ExcerptBuilder.addBlankLine(excerptTokens);
 | 
			
		||||
            ExcerptBuilder_1.ExcerptBuilder.addDeclaration(excerptTokens, ancillaryDeclaration, nodesToCapture, this._referenceGenerator);
 | 
			
		||||
        }
 | 
			
		||||
        return excerptTokens;
 | 
			
		||||
    }
 | 
			
		||||
    _captureTypeParameters(nodesToCapture, typeParameterNodes) {
 | 
			
		||||
        const typeParameters = [];
 | 
			
		||||
        if (typeParameterNodes) {
 | 
			
		||||
            for (const typeParameter of typeParameterNodes) {
 | 
			
		||||
                const constraintTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                nodesToCapture.push({ node: typeParameter.constraint, tokenRange: constraintTokenRange });
 | 
			
		||||
                const defaultTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
                nodesToCapture.push({ node: typeParameter.default, tokenRange: defaultTypeTokenRange });
 | 
			
		||||
                typeParameters.push({
 | 
			
		||||
                    typeParameterName: typeParameter.name.getText().trim(),
 | 
			
		||||
                    constraintTokenRange,
 | 
			
		||||
                    defaultTypeTokenRange
 | 
			
		||||
                });
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return typeParameters;
 | 
			
		||||
    }
 | 
			
		||||
    _captureParameters(nodesToCapture, parameterNodes) {
 | 
			
		||||
        const parameters = [];
 | 
			
		||||
        for (const parameter of parameterNodes) {
 | 
			
		||||
            const parameterTypeTokenRange = ExcerptBuilder_1.ExcerptBuilder.createEmptyTokenRange();
 | 
			
		||||
            nodesToCapture.push({ node: parameter.type, tokenRange: parameterTypeTokenRange });
 | 
			
		||||
            parameters.push({
 | 
			
		||||
                parameterName: parameter.name.getText().trim(),
 | 
			
		||||
                parameterTypeTokenRange,
 | 
			
		||||
                isOptional: this._collector.typeChecker.isOptionalParameter(parameter)
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
        return parameters;
 | 
			
		||||
    }
 | 
			
		||||
    _isReadonly(astDeclaration) {
 | 
			
		||||
        var _a;
 | 
			
		||||
        switch (astDeclaration.declaration.kind) {
 | 
			
		||||
            case ts.SyntaxKind.GetAccessor:
 | 
			
		||||
            case ts.SyntaxKind.IndexSignature:
 | 
			
		||||
            case ts.SyntaxKind.PropertyDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.PropertySignature:
 | 
			
		||||
            case ts.SyntaxKind.SetAccessor:
 | 
			
		||||
            case ts.SyntaxKind.VariableDeclaration: {
 | 
			
		||||
                const apiItemMetadata = this._collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
                const docComment = apiItemMetadata.tsdocComment;
 | 
			
		||||
                const declarationMetadata = this._collector.fetchDeclarationMetadata(astDeclaration);
 | 
			
		||||
                const hasReadonlyModifier = (astDeclaration.modifierFlags & ts.ModifierFlags.Readonly) !== 0;
 | 
			
		||||
                const hasReadonlyDocTag = !!((_a = docComment === null || docComment === void 0 ? void 0 : docComment.modifierTagSet) === null || _a === void 0 ? void 0 : _a.hasTagName('@readonly'));
 | 
			
		||||
                const isGetterWithNoSetter = ts.isGetAccessorDeclaration(astDeclaration.declaration) &&
 | 
			
		||||
                    declarationMetadata.ancillaryDeclarations.length === 0;
 | 
			
		||||
                const isVarConst = ts.isVariableDeclaration(astDeclaration.declaration) &&
 | 
			
		||||
                    TypeScriptInternals_1.TypeScriptInternals.isVarConst(astDeclaration.declaration);
 | 
			
		||||
                return hasReadonlyModifier || hasReadonlyDocTag || isGetterWithNoSetter || isVarConst;
 | 
			
		||||
            }
 | 
			
		||||
            default: {
 | 
			
		||||
                // Readonly-ness does not make sense for any other declaration kind.
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _getFileUrlPath(declaration) {
 | 
			
		||||
        const sourceFile = declaration.getSourceFile();
 | 
			
		||||
        const sourceLocation = this._collector.sourceMapper.getSourceLocation({
 | 
			
		||||
            sourceFile,
 | 
			
		||||
            pos: declaration.pos
 | 
			
		||||
        });
 | 
			
		||||
        let result = path.relative(this._collector.extractorConfig.projectFolder, sourceLocation.sourceFilePath);
 | 
			
		||||
        result = node_core_library_1.Path.convertToSlashes(result);
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.ApiModelGenerator = ApiModelGenerator;
 | 
			
		||||
//# sourceMappingURL=ApiModelGenerator.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiModelGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										30
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
import { Collector } from '../collector/Collector';
 | 
			
		||||
export declare class ApiReportGenerator {
 | 
			
		||||
    private static _trimSpacesRegExp;
 | 
			
		||||
    /**
 | 
			
		||||
     * Compares the contents of two API files that were created using ApiFileGenerator,
 | 
			
		||||
     * and returns true if they are equivalent.  Note that these files are not normally edited
 | 
			
		||||
     * by a human; the "equivalence" comparison here is intended to ignore spurious changes that
 | 
			
		||||
     * might be introduced by a tool, e.g. Git newline normalization or an editor that strips
 | 
			
		||||
     * whitespace when saving.
 | 
			
		||||
     */
 | 
			
		||||
    static areEquivalentApiFileContents(actualFileContent: string, expectedFileContent: string): boolean;
 | 
			
		||||
    static generateReviewFileContent(collector: Collector): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Before writing out a declaration, _modifySpan() applies various fixups to make it nice.
 | 
			
		||||
     */
 | 
			
		||||
    private static _modifySpan;
 | 
			
		||||
    private static _shouldIncludeInReport;
 | 
			
		||||
    /**
 | 
			
		||||
     * For declarations marked as `@preapproved`, this is used instead of _modifySpan().
 | 
			
		||||
     */
 | 
			
		||||
    private static _modifySpanForPreapproved;
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes a synopsis of the AEDoc comments, which indicates the release tag,
 | 
			
		||||
     * whether the item has been documented, and any warnings that were detected
 | 
			
		||||
     * by the analysis.
 | 
			
		||||
     */
 | 
			
		||||
    private static _getAedocSynopsis;
 | 
			
		||||
    private static _writeLineAsComments;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=ApiReportGenerator.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"ApiReportGenerator.d.ts","sourceRoot":"","sources":["../../src/generators/ApiReportGenerator.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAiBnD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAmB;IAEnD;;;;;;OAMG;WACW,4BAA4B,CACxC,iBAAiB,EAAE,MAAM,EACzB,mBAAmB,EAAE,MAAM,GAC1B,OAAO;WAOI,yBAAyB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM;IA6MrE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IAqL1B,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAMrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IA8CxC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAgEhC,OAAO,CAAC,MAAM,CAAC,oBAAoB;CAQpC"}
 | 
			
		||||
							
								
								
									
										455
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										455
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,455 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.ApiReportGenerator = void 0;
 | 
			
		||||
const ts = __importStar(require("typescript"));
 | 
			
		||||
const node_core_library_1 = require("@rushstack/node-core-library");
 | 
			
		||||
const api_extractor_model_1 = require("@microsoft/api-extractor-model");
 | 
			
		||||
const Collector_1 = require("../collector/Collector");
 | 
			
		||||
const TypeScriptHelpers_1 = require("../analyzer/TypeScriptHelpers");
 | 
			
		||||
const Span_1 = require("../analyzer/Span");
 | 
			
		||||
const AstDeclaration_1 = require("../analyzer/AstDeclaration");
 | 
			
		||||
const AstImport_1 = require("../analyzer/AstImport");
 | 
			
		||||
const AstSymbol_1 = require("../analyzer/AstSymbol");
 | 
			
		||||
const IndentedWriter_1 = require("./IndentedWriter");
 | 
			
		||||
const DtsEmitHelpers_1 = require("./DtsEmitHelpers");
 | 
			
		||||
const AstNamespaceImport_1 = require("../analyzer/AstNamespaceImport");
 | 
			
		||||
const SourceFileLocationFormatter_1 = require("../analyzer/SourceFileLocationFormatter");
 | 
			
		||||
class ApiReportGenerator {
 | 
			
		||||
    /**
 | 
			
		||||
     * Compares the contents of two API files that were created using ApiFileGenerator,
 | 
			
		||||
     * and returns true if they are equivalent.  Note that these files are not normally edited
 | 
			
		||||
     * by a human; the "equivalence" comparison here is intended to ignore spurious changes that
 | 
			
		||||
     * might be introduced by a tool, e.g. Git newline normalization or an editor that strips
 | 
			
		||||
     * whitespace when saving.
 | 
			
		||||
     */
 | 
			
		||||
    static areEquivalentApiFileContents(actualFileContent, expectedFileContent) {
 | 
			
		||||
        // NOTE: "\s" also matches "\r" and "\n"
 | 
			
		||||
        const normalizedActual = actualFileContent.replace(/[\s]+/g, ' ');
 | 
			
		||||
        const normalizedExpected = expectedFileContent.replace(/[\s]+/g, ' ');
 | 
			
		||||
        return normalizedActual === normalizedExpected;
 | 
			
		||||
    }
 | 
			
		||||
    static generateReviewFileContent(collector) {
 | 
			
		||||
        const writer = new IndentedWriter_1.IndentedWriter();
 | 
			
		||||
        writer.trimLeadingSpaces = true;
 | 
			
		||||
        writer.writeLine([
 | 
			
		||||
            `## API Report File for "${collector.workingPackage.name}"`,
 | 
			
		||||
            ``,
 | 
			
		||||
            `> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).`,
 | 
			
		||||
            ``
 | 
			
		||||
        ].join('\n'));
 | 
			
		||||
        // Write the opening delimiter for the Markdown code fence
 | 
			
		||||
        writer.writeLine('```ts\n');
 | 
			
		||||
        // Emit the triple slash directives
 | 
			
		||||
        for (const typeDirectiveReference of Array.from(collector.dtsTypeReferenceDirectives).sort()) {
 | 
			
		||||
            // https://github.com/microsoft/TypeScript/blob/611ebc7aadd7a44a4c0447698bfda9222a78cb66/src/compiler/declarationEmitter.ts#L162
 | 
			
		||||
            writer.writeLine(`/// <reference types="${typeDirectiveReference}" />`);
 | 
			
		||||
        }
 | 
			
		||||
        for (const libDirectiveReference of Array.from(collector.dtsLibReferenceDirectives).sort()) {
 | 
			
		||||
            writer.writeLine(`/// <reference lib="${libDirectiveReference}" />`);
 | 
			
		||||
        }
 | 
			
		||||
        writer.ensureSkippedLine();
 | 
			
		||||
        // Emit the imports
 | 
			
		||||
        for (const entity of collector.entities) {
 | 
			
		||||
            if (entity.astEntity instanceof AstImport_1.AstImport) {
 | 
			
		||||
                DtsEmitHelpers_1.DtsEmitHelpers.emitImport(writer, entity, entity.astEntity);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        writer.ensureSkippedLine();
 | 
			
		||||
        // Emit the regular declarations
 | 
			
		||||
        for (const entity of collector.entities) {
 | 
			
		||||
            const astEntity = entity.astEntity;
 | 
			
		||||
            if (entity.consumable || collector.extractorConfig.apiReportIncludeForgottenExports) {
 | 
			
		||||
                const exportsToEmit = new Map();
 | 
			
		||||
                for (const exportName of entity.exportNames) {
 | 
			
		||||
                    if (!entity.shouldInlineExport) {
 | 
			
		||||
                        exportsToEmit.set(exportName, { exportName, associatedMessages: [] });
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (astEntity instanceof AstSymbol_1.AstSymbol) {
 | 
			
		||||
                    // Emit all the declarations for this entity
 | 
			
		||||
                    for (const astDeclaration of astEntity.astDeclarations || []) {
 | 
			
		||||
                        // Get the messages associated with this declaration
 | 
			
		||||
                        const fetchedMessages = collector.messageRouter.fetchAssociatedMessagesForReviewFile(astDeclaration);
 | 
			
		||||
                        // Peel off the messages associated with an export statement and store them
 | 
			
		||||
                        // in IExportToEmit.associatedMessages (to be processed later).  The remaining messages will
 | 
			
		||||
                        // added to messagesToReport, to be emitted next to the declaration instead of the export statement.
 | 
			
		||||
                        const messagesToReport = [];
 | 
			
		||||
                        for (const message of fetchedMessages) {
 | 
			
		||||
                            if (message.properties.exportName) {
 | 
			
		||||
                                const exportToEmit = exportsToEmit.get(message.properties.exportName);
 | 
			
		||||
                                if (exportToEmit) {
 | 
			
		||||
                                    exportToEmit.associatedMessages.push(message);
 | 
			
		||||
                                    continue;
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            messagesToReport.push(message);
 | 
			
		||||
                        }
 | 
			
		||||
                        writer.ensureSkippedLine();
 | 
			
		||||
                        writer.write(ApiReportGenerator._getAedocSynopsis(collector, astDeclaration, messagesToReport));
 | 
			
		||||
                        const span = new Span_1.Span(astDeclaration.declaration);
 | 
			
		||||
                        const apiItemMetadata = collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
                        if (apiItemMetadata.isPreapproved) {
 | 
			
		||||
                            ApiReportGenerator._modifySpanForPreapproved(span);
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            ApiReportGenerator._modifySpan(collector, span, entity, astDeclaration, false);
 | 
			
		||||
                        }
 | 
			
		||||
                        span.writeModifiedText(writer);
 | 
			
		||||
                        writer.ensureNewLine();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (astEntity instanceof AstNamespaceImport_1.AstNamespaceImport) {
 | 
			
		||||
                    const astModuleExportInfo = astEntity.fetchAstModuleExportInfo(collector);
 | 
			
		||||
                    if (entity.nameForEmit === undefined) {
 | 
			
		||||
                        // This should never happen
 | 
			
		||||
                        throw new node_core_library_1.InternalError('referencedEntry.nameForEmit is undefined');
 | 
			
		||||
                    }
 | 
			
		||||
                    if (astModuleExportInfo.starExportedExternalModules.size > 0) {
 | 
			
		||||
                        // We could support this, but we would need to find a way to safely represent it.
 | 
			
		||||
                        throw new Error(`The ${entity.nameForEmit} namespace import includes a star export, which is not supported:\n` +
 | 
			
		||||
                            SourceFileLocationFormatter_1.SourceFileLocationFormatter.formatDeclaration(astEntity.declaration));
 | 
			
		||||
                    }
 | 
			
		||||
                    // Emit a synthetic declaration for the namespace.  It will look like this:
 | 
			
		||||
                    //
 | 
			
		||||
                    //    declare namespace example {
 | 
			
		||||
                    //      export {
 | 
			
		||||
                    //        f1,
 | 
			
		||||
                    //        f2
 | 
			
		||||
                    //      }
 | 
			
		||||
                    //    }
 | 
			
		||||
                    //
 | 
			
		||||
                    // Note that we do not try to relocate f1()/f2() to be inside the namespace because other type
 | 
			
		||||
                    // signatures may reference them directly (without using the namespace qualifier).
 | 
			
		||||
                    writer.ensureSkippedLine();
 | 
			
		||||
                    writer.writeLine(`declare namespace ${entity.nameForEmit} {`);
 | 
			
		||||
                    // all local exports of local imported module are just references to top-level declarations
 | 
			
		||||
                    writer.increaseIndent();
 | 
			
		||||
                    writer.writeLine('export {');
 | 
			
		||||
                    writer.increaseIndent();
 | 
			
		||||
                    const exportClauses = [];
 | 
			
		||||
                    for (const [exportedName, exportedEntity] of astModuleExportInfo.exportedLocalEntities) {
 | 
			
		||||
                        const collectorEntity = collector.tryGetCollectorEntity(exportedEntity);
 | 
			
		||||
                        if (collectorEntity === undefined) {
 | 
			
		||||
                            // This should never happen
 | 
			
		||||
                            // top-level exports of local imported module should be added as collector entities before
 | 
			
		||||
                            throw new node_core_library_1.InternalError(`Cannot find collector entity for ${entity.nameForEmit}.${exportedEntity.localName}`);
 | 
			
		||||
                        }
 | 
			
		||||
                        if (collectorEntity.nameForEmit === exportedName) {
 | 
			
		||||
                            exportClauses.push(collectorEntity.nameForEmit);
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            exportClauses.push(`${collectorEntity.nameForEmit} as ${exportedName}`);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    writer.writeLine(exportClauses.join(',\n'));
 | 
			
		||||
                    writer.decreaseIndent();
 | 
			
		||||
                    writer.writeLine('}'); // end of "export { ... }"
 | 
			
		||||
                    writer.decreaseIndent();
 | 
			
		||||
                    writer.writeLine('}'); // end of "declare namespace { ... }"
 | 
			
		||||
                }
 | 
			
		||||
                // Now emit the export statements for this entity.
 | 
			
		||||
                for (const exportToEmit of exportsToEmit.values()) {
 | 
			
		||||
                    // Write any associated messages
 | 
			
		||||
                    if (exportToEmit.associatedMessages.length > 0) {
 | 
			
		||||
                        writer.ensureSkippedLine();
 | 
			
		||||
                        for (const message of exportToEmit.associatedMessages) {
 | 
			
		||||
                            ApiReportGenerator._writeLineAsComments(writer, 'Warning: ' + message.formatMessageWithoutLocation());
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    DtsEmitHelpers_1.DtsEmitHelpers.emitNamedExport(writer, exportToEmit.exportName, entity);
 | 
			
		||||
                }
 | 
			
		||||
                writer.ensureSkippedLine();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        DtsEmitHelpers_1.DtsEmitHelpers.emitStarExports(writer, collector);
 | 
			
		||||
        // Write the unassociated warnings at the bottom of the file
 | 
			
		||||
        const unassociatedMessages = collector.messageRouter.fetchUnassociatedMessagesForReviewFile();
 | 
			
		||||
        if (unassociatedMessages.length > 0) {
 | 
			
		||||
            writer.ensureSkippedLine();
 | 
			
		||||
            ApiReportGenerator._writeLineAsComments(writer, 'Warnings were encountered during analysis:');
 | 
			
		||||
            ApiReportGenerator._writeLineAsComments(writer, '');
 | 
			
		||||
            for (const unassociatedMessage of unassociatedMessages) {
 | 
			
		||||
                ApiReportGenerator._writeLineAsComments(writer, unassociatedMessage.formatMessageWithLocation(collector.workingPackage.packageFolder));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (collector.workingPackage.tsdocComment === undefined) {
 | 
			
		||||
            writer.ensureSkippedLine();
 | 
			
		||||
            ApiReportGenerator._writeLineAsComments(writer, '(No @packageDocumentation comment for this package)');
 | 
			
		||||
        }
 | 
			
		||||
        // Write the closing delimiter for the Markdown code fence
 | 
			
		||||
        writer.ensureSkippedLine();
 | 
			
		||||
        writer.writeLine('```');
 | 
			
		||||
        // Remove any trailing spaces
 | 
			
		||||
        return writer.toString().replace(ApiReportGenerator._trimSpacesRegExp, '');
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Before writing out a declaration, _modifySpan() applies various fixups to make it nice.
 | 
			
		||||
     */
 | 
			
		||||
    static _modifySpan(collector, span, entity, astDeclaration, insideTypeLiteral) {
 | 
			
		||||
        // Should we process this declaration at all?
 | 
			
		||||
        // eslint-disable-next-line no-bitwise
 | 
			
		||||
        if (!ApiReportGenerator._shouldIncludeInReport(astDeclaration)) {
 | 
			
		||||
            span.modification.skipAll();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        const previousSpan = span.previousSibling;
 | 
			
		||||
        let recurseChildren = true;
 | 
			
		||||
        let sortChildren = false;
 | 
			
		||||
        switch (span.kind) {
 | 
			
		||||
            case ts.SyntaxKind.JSDocComment:
 | 
			
		||||
                span.modification.skipAll();
 | 
			
		||||
                // For now, we don't transform JSDoc comment nodes at all
 | 
			
		||||
                recurseChildren = false;
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ExportKeyword:
 | 
			
		||||
            case ts.SyntaxKind.DefaultKeyword:
 | 
			
		||||
            case ts.SyntaxKind.DeclareKeyword:
 | 
			
		||||
                // Delete any explicit "export" or "declare" keywords -- we will re-add them below
 | 
			
		||||
                span.modification.skipAll();
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.InterfaceKeyword:
 | 
			
		||||
            case ts.SyntaxKind.ClassKeyword:
 | 
			
		||||
            case ts.SyntaxKind.EnumKeyword:
 | 
			
		||||
            case ts.SyntaxKind.NamespaceKeyword:
 | 
			
		||||
            case ts.SyntaxKind.ModuleKeyword:
 | 
			
		||||
            case ts.SyntaxKind.TypeKeyword:
 | 
			
		||||
            case ts.SyntaxKind.FunctionKeyword:
 | 
			
		||||
                // Replace the stuff we possibly deleted above
 | 
			
		||||
                let replacedModifiers = '';
 | 
			
		||||
                if (entity.shouldInlineExport) {
 | 
			
		||||
                    replacedModifiers = 'export ' + replacedModifiers;
 | 
			
		||||
                }
 | 
			
		||||
                if (previousSpan && previousSpan.kind === ts.SyntaxKind.SyntaxList) {
 | 
			
		||||
                    // If there is a previous span of type SyntaxList, then apply it before any other modifiers
 | 
			
		||||
                    // (e.g. "abstract") that appear there.
 | 
			
		||||
                    previousSpan.modification.prefix = replacedModifiers + previousSpan.modification.prefix;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    // Otherwise just stick it in front of this span
 | 
			
		||||
                    span.modification.prefix = replacedModifiers + span.modification.prefix;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.SyntaxList:
 | 
			
		||||
                if (span.parent) {
 | 
			
		||||
                    if (AstDeclaration_1.AstDeclaration.isSupportedSyntaxKind(span.parent.kind)) {
 | 
			
		||||
                        // If the immediate parent is an API declaration, and the immediate children are API declarations,
 | 
			
		||||
                        // then sort the children alphabetically
 | 
			
		||||
                        sortChildren = true;
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (span.parent.kind === ts.SyntaxKind.ModuleBlock) {
 | 
			
		||||
                        // Namespaces are special because their chain goes ModuleDeclaration -> ModuleBlock -> SyntaxList
 | 
			
		||||
                        sortChildren = true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.VariableDeclaration:
 | 
			
		||||
                if (!span.parent) {
 | 
			
		||||
                    // The VariableDeclaration node is part of a VariableDeclarationList, however
 | 
			
		||||
                    // the Entry.followedSymbol points to the VariableDeclaration part because
 | 
			
		||||
                    // multiple definitions might share the same VariableDeclarationList.
 | 
			
		||||
                    //
 | 
			
		||||
                    // Since we are emitting a separate declaration for each one, we need to look upwards
 | 
			
		||||
                    // in the ts.Node tree and write a copy of the enclosing VariableDeclarationList
 | 
			
		||||
                    // content (e.g. "var" from "var x=1, y=2").
 | 
			
		||||
                    const list = TypeScriptHelpers_1.TypeScriptHelpers.matchAncestor(span.node, [
 | 
			
		||||
                        ts.SyntaxKind.VariableDeclarationList,
 | 
			
		||||
                        ts.SyntaxKind.VariableDeclaration
 | 
			
		||||
                    ]);
 | 
			
		||||
                    if (!list) {
 | 
			
		||||
                        // This should not happen unless the compiler API changes somehow
 | 
			
		||||
                        throw new node_core_library_1.InternalError('Unsupported variable declaration');
 | 
			
		||||
                    }
 | 
			
		||||
                    const listPrefix = list
 | 
			
		||||
                        .getSourceFile()
 | 
			
		||||
                        .text.substring(list.getStart(), list.declarations[0].getStart());
 | 
			
		||||
                    span.modification.prefix = listPrefix + span.modification.prefix;
 | 
			
		||||
                    span.modification.suffix = ';';
 | 
			
		||||
                    if (entity.shouldInlineExport) {
 | 
			
		||||
                        span.modification.prefix = 'export ' + span.modification.prefix;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.Identifier:
 | 
			
		||||
                const referencedEntity = collector.tryGetEntityForNode(span.node);
 | 
			
		||||
                if (referencedEntity) {
 | 
			
		||||
                    if (!referencedEntity.nameForEmit) {
 | 
			
		||||
                        // This should never happen
 | 
			
		||||
                        throw new node_core_library_1.InternalError('referencedEntry.nameForEmit is undefined');
 | 
			
		||||
                    }
 | 
			
		||||
                    span.modification.prefix = referencedEntity.nameForEmit;
 | 
			
		||||
                    // For debugging:
 | 
			
		||||
                    // span.modification.prefix += '/*R=FIX*/';
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    // For debugging:
 | 
			
		||||
                    // span.modification.prefix += '/*R=KEEP*/';
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.TypeLiteral:
 | 
			
		||||
                insideTypeLiteral = true;
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ImportType:
 | 
			
		||||
                DtsEmitHelpers_1.DtsEmitHelpers.modifyImportTypeSpan(collector, span, astDeclaration, (childSpan, childAstDeclaration) => {
 | 
			
		||||
                    ApiReportGenerator._modifySpan(collector, childSpan, entity, childAstDeclaration, insideTypeLiteral);
 | 
			
		||||
                });
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        if (recurseChildren) {
 | 
			
		||||
            for (const child of span.children) {
 | 
			
		||||
                let childAstDeclaration = astDeclaration;
 | 
			
		||||
                if (AstDeclaration_1.AstDeclaration.isSupportedSyntaxKind(child.kind)) {
 | 
			
		||||
                    childAstDeclaration = collector.astSymbolTable.getChildAstDeclarationByNode(child.node, astDeclaration);
 | 
			
		||||
                    if (ApiReportGenerator._shouldIncludeInReport(childAstDeclaration)) {
 | 
			
		||||
                        if (sortChildren) {
 | 
			
		||||
                            span.modification.sortChildren = true;
 | 
			
		||||
                            child.modification.sortKey = Collector_1.Collector.getSortKeyIgnoringUnderscore(childAstDeclaration.astSymbol.localName);
 | 
			
		||||
                        }
 | 
			
		||||
                        if (!insideTypeLiteral) {
 | 
			
		||||
                            const messagesToReport = collector.messageRouter.fetchAssociatedMessagesForReviewFile(childAstDeclaration);
 | 
			
		||||
                            // NOTE: This generates ae-undocumented messages as a side effect
 | 
			
		||||
                            const aedocSynopsis = ApiReportGenerator._getAedocSynopsis(collector, childAstDeclaration, messagesToReport);
 | 
			
		||||
                            child.modification.prefix = aedocSynopsis + child.modification.prefix;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                ApiReportGenerator._modifySpan(collector, child, entity, childAstDeclaration, insideTypeLiteral);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static _shouldIncludeInReport(astDeclaration) {
 | 
			
		||||
        // Private declarations are not included in the API report
 | 
			
		||||
        // eslint-disable-next-line no-bitwise
 | 
			
		||||
        return (astDeclaration.modifierFlags & ts.ModifierFlags.Private) === 0;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * For declarations marked as `@preapproved`, this is used instead of _modifySpan().
 | 
			
		||||
     */
 | 
			
		||||
    static _modifySpanForPreapproved(span) {
 | 
			
		||||
        // Match something like this:
 | 
			
		||||
        //
 | 
			
		||||
        //   ClassDeclaration:
 | 
			
		||||
        //     SyntaxList:
 | 
			
		||||
        //       ExportKeyword:  pre=[export] sep=[ ]
 | 
			
		||||
        //       DeclareKeyword:  pre=[declare] sep=[ ]
 | 
			
		||||
        //     ClassKeyword:  pre=[class] sep=[ ]
 | 
			
		||||
        //     Identifier:  pre=[_PreapprovedClass] sep=[ ]
 | 
			
		||||
        //     FirstPunctuation:  pre=[{] sep=[\n\n    ]
 | 
			
		||||
        //     SyntaxList:
 | 
			
		||||
        //       ...
 | 
			
		||||
        //     CloseBraceToken:  pre=[}]
 | 
			
		||||
        //
 | 
			
		||||
        // or this:
 | 
			
		||||
        //   ModuleDeclaration:
 | 
			
		||||
        //     SyntaxList:
 | 
			
		||||
        //       ExportKeyword:  pre=[export] sep=[ ]
 | 
			
		||||
        //       DeclareKeyword:  pre=[declare] sep=[ ]
 | 
			
		||||
        //     NamespaceKeyword:  pre=[namespace] sep=[ ]
 | 
			
		||||
        //     Identifier:  pre=[_PreapprovedNamespace] sep=[ ]
 | 
			
		||||
        //     ModuleBlock:
 | 
			
		||||
        //       FirstPunctuation:  pre=[{] sep=[\n\n    ]
 | 
			
		||||
        //       SyntaxList:
 | 
			
		||||
        //         ...
 | 
			
		||||
        //       CloseBraceToken:  pre=[}]
 | 
			
		||||
        //
 | 
			
		||||
        // And reduce it to something like this:
 | 
			
		||||
        //
 | 
			
		||||
        //   // @internal (undocumented)
 | 
			
		||||
        //   class _PreapprovedClass { /* (preapproved) */ }
 | 
			
		||||
        //
 | 
			
		||||
        let skipRest = false;
 | 
			
		||||
        for (const child of span.children) {
 | 
			
		||||
            if (skipRest || child.kind === ts.SyntaxKind.SyntaxList || child.kind === ts.SyntaxKind.JSDocComment) {
 | 
			
		||||
                child.modification.skipAll();
 | 
			
		||||
            }
 | 
			
		||||
            if (child.kind === ts.SyntaxKind.Identifier) {
 | 
			
		||||
                skipRest = true;
 | 
			
		||||
                child.modification.omitSeparatorAfter = true;
 | 
			
		||||
                child.modification.suffix = ' { /* (preapproved) */ }';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes a synopsis of the AEDoc comments, which indicates the release tag,
 | 
			
		||||
     * whether the item has been documented, and any warnings that were detected
 | 
			
		||||
     * by the analysis.
 | 
			
		||||
     */
 | 
			
		||||
    static _getAedocSynopsis(collector, astDeclaration, messagesToReport) {
 | 
			
		||||
        const writer = new IndentedWriter_1.IndentedWriter();
 | 
			
		||||
        for (const message of messagesToReport) {
 | 
			
		||||
            ApiReportGenerator._writeLineAsComments(writer, 'Warning: ' + message.formatMessageWithoutLocation());
 | 
			
		||||
        }
 | 
			
		||||
        if (!collector.isAncillaryDeclaration(astDeclaration)) {
 | 
			
		||||
            const footerParts = [];
 | 
			
		||||
            const apiItemMetadata = collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
            if (!apiItemMetadata.releaseTagSameAsParent) {
 | 
			
		||||
                if (apiItemMetadata.effectiveReleaseTag !== api_extractor_model_1.ReleaseTag.None) {
 | 
			
		||||
                    footerParts.push(api_extractor_model_1.ReleaseTag.getTagName(apiItemMetadata.effectiveReleaseTag));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (apiItemMetadata.isSealed) {
 | 
			
		||||
                footerParts.push('@sealed');
 | 
			
		||||
            }
 | 
			
		||||
            if (apiItemMetadata.isVirtual) {
 | 
			
		||||
                footerParts.push('@virtual');
 | 
			
		||||
            }
 | 
			
		||||
            if (apiItemMetadata.isOverride) {
 | 
			
		||||
                footerParts.push('@override');
 | 
			
		||||
            }
 | 
			
		||||
            if (apiItemMetadata.isEventProperty) {
 | 
			
		||||
                footerParts.push('@eventProperty');
 | 
			
		||||
            }
 | 
			
		||||
            if (apiItemMetadata.tsdocComment) {
 | 
			
		||||
                if (apiItemMetadata.tsdocComment.deprecatedBlock) {
 | 
			
		||||
                    footerParts.push('@deprecated');
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (apiItemMetadata.undocumented) {
 | 
			
		||||
                footerParts.push('(undocumented)');
 | 
			
		||||
                collector.messageRouter.addAnalyzerIssue("ae-undocumented" /* ExtractorMessageId.Undocumented */, `Missing documentation for "${astDeclaration.astSymbol.localName}".`, astDeclaration);
 | 
			
		||||
            }
 | 
			
		||||
            if (footerParts.length > 0) {
 | 
			
		||||
                if (messagesToReport.length > 0) {
 | 
			
		||||
                    ApiReportGenerator._writeLineAsComments(writer, ''); // skip a line after the warnings
 | 
			
		||||
                }
 | 
			
		||||
                ApiReportGenerator._writeLineAsComments(writer, footerParts.join(' '));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return writer.toString();
 | 
			
		||||
    }
 | 
			
		||||
    static _writeLineAsComments(writer, line) {
 | 
			
		||||
        const lines = node_core_library_1.Text.convertToLf(line).split('\n');
 | 
			
		||||
        for (const realLine of lines) {
 | 
			
		||||
            writer.write('// ');
 | 
			
		||||
            writer.write(realLine);
 | 
			
		||||
            writer.writeLine();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
ApiReportGenerator._trimSpacesRegExp = / +$/gm;
 | 
			
		||||
exports.ApiReportGenerator = ApiReportGenerator;
 | 
			
		||||
//# sourceMappingURL=ApiReportGenerator.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ApiReportGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										26
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
import * as ts from 'typescript';
 | 
			
		||||
import { DeclarationReference } from '@microsoft/tsdoc/lib-commonjs/beta/DeclarationReference';
 | 
			
		||||
import type { Collector } from '../collector/Collector';
 | 
			
		||||
export declare class DeclarationReferenceGenerator {
 | 
			
		||||
    static readonly unknownReference: string;
 | 
			
		||||
    private _collector;
 | 
			
		||||
    constructor(collector: Collector);
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the UID for a TypeScript Identifier that references a type.
 | 
			
		||||
     */
 | 
			
		||||
    getDeclarationReferenceForIdentifier(node: ts.Identifier): DeclarationReference | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the DeclarationReference for a TypeScript Symbol for a given meaning.
 | 
			
		||||
     */
 | 
			
		||||
    getDeclarationReferenceForSymbol(symbol: ts.Symbol, meaning: ts.SymbolFlags): DeclarationReference | undefined;
 | 
			
		||||
    private static _isInExpressionContext;
 | 
			
		||||
    private static _isExternalModuleSymbol;
 | 
			
		||||
    private static _isSameSymbol;
 | 
			
		||||
    private _getNavigationToSymbol;
 | 
			
		||||
    private static _getMeaningOfSymbol;
 | 
			
		||||
    private _symbolToDeclarationReference;
 | 
			
		||||
    private _getParentReference;
 | 
			
		||||
    private _getPackageName;
 | 
			
		||||
    private _sourceFileToModuleSource;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=DeclarationReferenceGenerator.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"DeclarationReferenceGenerator.d.ts","sourceRoot":"","sources":["../../src/generators/DeclarationReferenceGenerator.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AACjC,OAAO,EACL,oBAAoB,EAKrB,MAAM,yDAAyD,CAAC;AAIjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAIxD,qBAAa,6BAA6B;IACxC,gBAAuB,gBAAgB,EAAE,MAAM,CAAO;IAEtD,OAAO,CAAC,UAAU,CAAY;gBAEX,SAAS,EAAE,SAAS;IAIvC;;OAEG;IACI,oCAAoC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,oBAAoB,GAAG,SAAS;IAkBlG;;OAEG;IACI,gCAAgC,CACrC,MAAM,EAAE,EAAE,CAAC,MAAM,EACjB,OAAO,EAAE,EAAE,CAAC,WAAW,GACtB,oBAAoB,GAAG,SAAS;IAInC,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAYrC,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAQtC,OAAO,CAAC,MAAM,CAAC,aAAa;IAY5B,OAAO,CAAC,sBAAsB;IAoD9B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAiDlC,OAAO,CAAC,6BAA6B;IAiFrC,OAAO,CAAC,mBAAmB;IA8E3B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,yBAAyB;CAelC"}
 | 
			
		||||
							
								
								
									
										319
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										319
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,319 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.DeclarationReferenceGenerator = void 0;
 | 
			
		||||
/* eslint-disable no-bitwise */
 | 
			
		||||
const ts = __importStar(require("typescript"));
 | 
			
		||||
const DeclarationReference_1 = require("@microsoft/tsdoc/lib-commonjs/beta/DeclarationReference");
 | 
			
		||||
const node_core_library_1 = require("@rushstack/node-core-library");
 | 
			
		||||
const TypeScriptHelpers_1 = require("../analyzer/TypeScriptHelpers");
 | 
			
		||||
const TypeScriptInternals_1 = require("../analyzer/TypeScriptInternals");
 | 
			
		||||
const AstNamespaceImport_1 = require("../analyzer/AstNamespaceImport");
 | 
			
		||||
class DeclarationReferenceGenerator {
 | 
			
		||||
    constructor(collector) {
 | 
			
		||||
        this._collector = collector;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the UID for a TypeScript Identifier that references a type.
 | 
			
		||||
     */
 | 
			
		||||
    getDeclarationReferenceForIdentifier(node) {
 | 
			
		||||
        const symbol = this._collector.typeChecker.getSymbolAtLocation(node);
 | 
			
		||||
        if (symbol !== undefined) {
 | 
			
		||||
            const isExpression = DeclarationReferenceGenerator._isInExpressionContext(node);
 | 
			
		||||
            return (this.getDeclarationReferenceForSymbol(symbol, isExpression ? ts.SymbolFlags.Value : ts.SymbolFlags.Type) ||
 | 
			
		||||
                this.getDeclarationReferenceForSymbol(symbol, isExpression ? ts.SymbolFlags.Type : ts.SymbolFlags.Value) ||
 | 
			
		||||
                this.getDeclarationReferenceForSymbol(symbol, ts.SymbolFlags.Namespace));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the DeclarationReference for a TypeScript Symbol for a given meaning.
 | 
			
		||||
     */
 | 
			
		||||
    getDeclarationReferenceForSymbol(symbol, meaning) {
 | 
			
		||||
        return this._symbolToDeclarationReference(symbol, meaning, /*includeModuleSymbols*/ false);
 | 
			
		||||
    }
 | 
			
		||||
    static _isInExpressionContext(node) {
 | 
			
		||||
        switch (node.parent.kind) {
 | 
			
		||||
            case ts.SyntaxKind.TypeQuery:
 | 
			
		||||
            case ts.SyntaxKind.ComputedPropertyName:
 | 
			
		||||
                return true;
 | 
			
		||||
            case ts.SyntaxKind.QualifiedName:
 | 
			
		||||
                return DeclarationReferenceGenerator._isInExpressionContext(node.parent);
 | 
			
		||||
            default:
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static _isExternalModuleSymbol(symbol) {
 | 
			
		||||
        return (!!(symbol.flags & ts.SymbolFlags.ValueModule) &&
 | 
			
		||||
            symbol.valueDeclaration !== undefined &&
 | 
			
		||||
            ts.isSourceFile(symbol.valueDeclaration));
 | 
			
		||||
    }
 | 
			
		||||
    static _isSameSymbol(left, right) {
 | 
			
		||||
        return (left === right ||
 | 
			
		||||
            !!(left &&
 | 
			
		||||
                left.valueDeclaration &&
 | 
			
		||||
                right.valueDeclaration &&
 | 
			
		||||
                left.valueDeclaration === right.valueDeclaration));
 | 
			
		||||
    }
 | 
			
		||||
    _getNavigationToSymbol(symbol) {
 | 
			
		||||
        const declaration = TypeScriptHelpers_1.TypeScriptHelpers.tryGetADeclaration(symbol);
 | 
			
		||||
        const sourceFile = declaration === null || declaration === void 0 ? void 0 : declaration.getSourceFile();
 | 
			
		||||
        const parent = TypeScriptInternals_1.TypeScriptInternals.getSymbolParent(symbol);
 | 
			
		||||
        // If it's global or from an external library, then use either Members or Exports. It's not possible for
 | 
			
		||||
        // global symbols or external library symbols to be Locals.
 | 
			
		||||
        const isGlobal = !!sourceFile && !ts.isExternalModule(sourceFile);
 | 
			
		||||
        const isFromExternalLibrary = !!sourceFile && this._collector.program.isSourceFileFromExternalLibrary(sourceFile);
 | 
			
		||||
        if (isGlobal || isFromExternalLibrary) {
 | 
			
		||||
            if (parent &&
 | 
			
		||||
                parent.members &&
 | 
			
		||||
                DeclarationReferenceGenerator._isSameSymbol(parent.members.get(symbol.escapedName), symbol)) {
 | 
			
		||||
                return "#" /* Navigation.Members */;
 | 
			
		||||
            }
 | 
			
		||||
            return "." /* Navigation.Exports */;
 | 
			
		||||
        }
 | 
			
		||||
        // Otherwise, this symbol is from the current package. If we've found an associated consumable
 | 
			
		||||
        // `CollectorEntity`, then use Exports. We use `consumable` here instead of `exported` because
 | 
			
		||||
        // if the symbol is exported from a non-consumable `AstNamespaceImport`, we don't want to use
 | 
			
		||||
        // Exports. We should use Locals instead.
 | 
			
		||||
        const entity = this._collector.tryGetEntityForSymbol(symbol);
 | 
			
		||||
        if (entity === null || entity === void 0 ? void 0 : entity.consumable) {
 | 
			
		||||
            return "." /* Navigation.Exports */;
 | 
			
		||||
        }
 | 
			
		||||
        // If its parent symbol is not a source file, then use either Exports or Members. If the parent symbol
 | 
			
		||||
        // is a source file, but it wasn't exported from the package entry point (in the check above), then the
 | 
			
		||||
        // symbol is a local, so fall through below.
 | 
			
		||||
        if (parent && !DeclarationReferenceGenerator._isExternalModuleSymbol(parent)) {
 | 
			
		||||
            if (parent.members &&
 | 
			
		||||
                DeclarationReferenceGenerator._isSameSymbol(parent.members.get(symbol.escapedName), symbol)) {
 | 
			
		||||
                return "#" /* Navigation.Members */;
 | 
			
		||||
            }
 | 
			
		||||
            return "." /* Navigation.Exports */;
 | 
			
		||||
        }
 | 
			
		||||
        // Otherwise, we have a local symbol, so use a Locals navigation. These are either:
 | 
			
		||||
        //
 | 
			
		||||
        // 1. Symbols that are exported from a file module but not the package entry point.
 | 
			
		||||
        // 2. Symbols that are not exported from their parent module.
 | 
			
		||||
        return "~" /* Navigation.Locals */;
 | 
			
		||||
    }
 | 
			
		||||
    static _getMeaningOfSymbol(symbol, meaning) {
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Class) {
 | 
			
		||||
            return "class" /* Meaning.Class */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Enum) {
 | 
			
		||||
            return "enum" /* Meaning.Enum */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Interface) {
 | 
			
		||||
            return "interface" /* Meaning.Interface */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.TypeAlias) {
 | 
			
		||||
            return "type" /* Meaning.TypeAlias */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Function) {
 | 
			
		||||
            return "function" /* Meaning.Function */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Variable) {
 | 
			
		||||
            return "var" /* Meaning.Variable */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Module) {
 | 
			
		||||
            return "namespace" /* Meaning.Namespace */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.ClassMember) {
 | 
			
		||||
            return "member" /* Meaning.Member */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Constructor) {
 | 
			
		||||
            return "constructor" /* Meaning.Constructor */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.EnumMember) {
 | 
			
		||||
            return "member" /* Meaning.Member */;
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.Signature) {
 | 
			
		||||
            if (symbol.escapedName === ts.InternalSymbolName.Call) {
 | 
			
		||||
                return "call" /* Meaning.CallSignature */;
 | 
			
		||||
            }
 | 
			
		||||
            if (symbol.escapedName === ts.InternalSymbolName.New) {
 | 
			
		||||
                return "new" /* Meaning.ConstructSignature */;
 | 
			
		||||
            }
 | 
			
		||||
            if (symbol.escapedName === ts.InternalSymbolName.Index) {
 | 
			
		||||
                return "index" /* Meaning.IndexSignature */;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (symbol.flags & meaning & ts.SymbolFlags.TypeParameter) {
 | 
			
		||||
            // This should have already been handled in `getDeclarationReferenceOfSymbol`.
 | 
			
		||||
            throw new node_core_library_1.InternalError('Not supported.');
 | 
			
		||||
        }
 | 
			
		||||
        return undefined;
 | 
			
		||||
    }
 | 
			
		||||
    _symbolToDeclarationReference(symbol, meaning, includeModuleSymbols) {
 | 
			
		||||
        const declaration = TypeScriptHelpers_1.TypeScriptHelpers.tryGetADeclaration(symbol);
 | 
			
		||||
        const sourceFile = declaration === null || declaration === void 0 ? void 0 : declaration.getSourceFile();
 | 
			
		||||
        let followedSymbol = symbol;
 | 
			
		||||
        if (followedSymbol.flags & ts.SymbolFlags.ExportValue) {
 | 
			
		||||
            followedSymbol = this._collector.typeChecker.getExportSymbolOfSymbol(followedSymbol);
 | 
			
		||||
        }
 | 
			
		||||
        if (followedSymbol.flags & ts.SymbolFlags.Alias) {
 | 
			
		||||
            followedSymbol = this._collector.typeChecker.getAliasedSymbol(followedSymbol);
 | 
			
		||||
            // Without this logic, we end up following the symbol `ns` in `import * as ns from './file'` to
 | 
			
		||||
            // the actual file `file.ts`. We don't want to do this, so revert to the original symbol.
 | 
			
		||||
            if (followedSymbol.flags & ts.SymbolFlags.ValueModule) {
 | 
			
		||||
                followedSymbol = symbol;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (DeclarationReferenceGenerator._isExternalModuleSymbol(followedSymbol)) {
 | 
			
		||||
            if (!includeModuleSymbols) {
 | 
			
		||||
                return undefined;
 | 
			
		||||
            }
 | 
			
		||||
            return new DeclarationReference_1.DeclarationReference(this._sourceFileToModuleSource(sourceFile));
 | 
			
		||||
        }
 | 
			
		||||
        // Do not generate a declaration reference for a type parameter.
 | 
			
		||||
        if (followedSymbol.flags & ts.SymbolFlags.TypeParameter) {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        let parentRef = this._getParentReference(followedSymbol);
 | 
			
		||||
        if (!parentRef) {
 | 
			
		||||
            return undefined;
 | 
			
		||||
        }
 | 
			
		||||
        let localName = followedSymbol.name;
 | 
			
		||||
        const entity = this._collector.tryGetEntityForSymbol(followedSymbol);
 | 
			
		||||
        if (entity === null || entity === void 0 ? void 0 : entity.nameForEmit) {
 | 
			
		||||
            localName = entity.nameForEmit;
 | 
			
		||||
        }
 | 
			
		||||
        if (followedSymbol.escapedName === ts.InternalSymbolName.Constructor) {
 | 
			
		||||
            localName = 'constructor';
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            const wellKnownName = TypeScriptHelpers_1.TypeScriptHelpers.tryDecodeWellKnownSymbolName(followedSymbol.escapedName);
 | 
			
		||||
            if (wellKnownName) {
 | 
			
		||||
                // TypeScript binds well-known ECMAScript symbols like 'Symbol.iterator' as '__@iterator'.
 | 
			
		||||
                // This converts a string like '__@iterator' into the property name '[Symbol.iterator]'.
 | 
			
		||||
                localName = wellKnownName;
 | 
			
		||||
            }
 | 
			
		||||
            else if (TypeScriptHelpers_1.TypeScriptHelpers.isUniqueSymbolName(followedSymbol.escapedName)) {
 | 
			
		||||
                for (const decl of followedSymbol.declarations || []) {
 | 
			
		||||
                    const declName = ts.getNameOfDeclaration(decl);
 | 
			
		||||
                    if (declName && ts.isComputedPropertyName(declName)) {
 | 
			
		||||
                        const lateName = TypeScriptHelpers_1.TypeScriptHelpers.tryGetLateBoundName(declName);
 | 
			
		||||
                        if (lateName !== undefined) {
 | 
			
		||||
                            localName = lateName;
 | 
			
		||||
                            break;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        const navigation = this._getNavigationToSymbol(followedSymbol);
 | 
			
		||||
        // If the symbol is a global, ensure the source is global.
 | 
			
		||||
        if (sourceFile && !ts.isExternalModule(sourceFile) && parentRef.source !== DeclarationReference_1.GlobalSource.instance) {
 | 
			
		||||
            parentRef = new DeclarationReference_1.DeclarationReference(DeclarationReference_1.GlobalSource.instance);
 | 
			
		||||
        }
 | 
			
		||||
        return parentRef
 | 
			
		||||
            .addNavigationStep(navigation, localName)
 | 
			
		||||
            .withMeaning(DeclarationReferenceGenerator._getMeaningOfSymbol(followedSymbol, meaning));
 | 
			
		||||
    }
 | 
			
		||||
    _getParentReference(symbol) {
 | 
			
		||||
        var _a;
 | 
			
		||||
        const declaration = TypeScriptHelpers_1.TypeScriptHelpers.tryGetADeclaration(symbol);
 | 
			
		||||
        const sourceFile = declaration === null || declaration === void 0 ? void 0 : declaration.getSourceFile();
 | 
			
		||||
        // Note that it's possible for a symbol to be exported from an entry point as well as one or more
 | 
			
		||||
        // namespaces. In that case, it's not clear what to choose as its parent. Today's logic is neither
 | 
			
		||||
        // perfect nor particularly stable to API items being renamed and shuffled around.
 | 
			
		||||
        const entity = this._collector.tryGetEntityForSymbol(symbol);
 | 
			
		||||
        if (entity) {
 | 
			
		||||
            if (entity.exportedFromEntryPoint) {
 | 
			
		||||
                return new DeclarationReference_1.DeclarationReference(this._sourceFileToModuleSource(sourceFile));
 | 
			
		||||
            }
 | 
			
		||||
            const firstExportingConsumableParent = entity.getFirstExportingConsumableParent();
 | 
			
		||||
            if (firstExportingConsumableParent &&
 | 
			
		||||
                firstExportingConsumableParent.astEntity instanceof AstNamespaceImport_1.AstNamespaceImport) {
 | 
			
		||||
                const parentSymbol = TypeScriptInternals_1.TypeScriptInternals.tryGetSymbolForDeclaration(firstExportingConsumableParent.astEntity.declaration, this._collector.typeChecker);
 | 
			
		||||
                if (parentSymbol) {
 | 
			
		||||
                    return this._symbolToDeclarationReference(parentSymbol, parentSymbol.flags, 
 | 
			
		||||
                    /*includeModuleSymbols*/ true);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // Next, try to find a parent symbol via the symbol tree.
 | 
			
		||||
        const parentSymbol = TypeScriptInternals_1.TypeScriptInternals.getSymbolParent(symbol);
 | 
			
		||||
        if (parentSymbol) {
 | 
			
		||||
            return this._symbolToDeclarationReference(parentSymbol, parentSymbol.flags, 
 | 
			
		||||
            /*includeModuleSymbols*/ true);
 | 
			
		||||
        }
 | 
			
		||||
        // If that doesn't work, try to find a parent symbol via the node tree. As far as we can tell,
 | 
			
		||||
        // this logic is only needed for local symbols within namespaces. For example:
 | 
			
		||||
        //
 | 
			
		||||
        // ```
 | 
			
		||||
        // export namespace n {
 | 
			
		||||
        //   type SomeType = number;
 | 
			
		||||
        //   export function someFunction(): SomeType { return 5; }
 | 
			
		||||
        // }
 | 
			
		||||
        // ```
 | 
			
		||||
        //
 | 
			
		||||
        // In the example above, `SomeType` doesn't have a parent symbol per the TS internal API above,
 | 
			
		||||
        // but its reference still needs to be qualified with the parent reference for `n`.
 | 
			
		||||
        const grandParent = (_a = declaration === null || declaration === void 0 ? void 0 : declaration.parent) === null || _a === void 0 ? void 0 : _a.parent;
 | 
			
		||||
        if (grandParent && ts.isModuleDeclaration(grandParent)) {
 | 
			
		||||
            const grandParentSymbol = TypeScriptInternals_1.TypeScriptInternals.tryGetSymbolForDeclaration(grandParent, this._collector.typeChecker);
 | 
			
		||||
            if (grandParentSymbol) {
 | 
			
		||||
                return this._symbolToDeclarationReference(grandParentSymbol, grandParentSymbol.flags, 
 | 
			
		||||
                /*includeModuleSymbols*/ true);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        // At this point, we have a local symbol in a module.
 | 
			
		||||
        if (sourceFile && ts.isExternalModule(sourceFile)) {
 | 
			
		||||
            return new DeclarationReference_1.DeclarationReference(this._sourceFileToModuleSource(sourceFile));
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            return new DeclarationReference_1.DeclarationReference(DeclarationReference_1.GlobalSource.instance);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _getPackageName(sourceFile) {
 | 
			
		||||
        if (this._collector.program.isSourceFileFromExternalLibrary(sourceFile)) {
 | 
			
		||||
            const packageJson = this._collector.packageJsonLookup.tryLoadNodePackageJsonFor(sourceFile.fileName);
 | 
			
		||||
            if (packageJson && packageJson.name) {
 | 
			
		||||
                return packageJson.name;
 | 
			
		||||
            }
 | 
			
		||||
            return DeclarationReferenceGenerator.unknownReference;
 | 
			
		||||
        }
 | 
			
		||||
        return this._collector.workingPackage.name;
 | 
			
		||||
    }
 | 
			
		||||
    _sourceFileToModuleSource(sourceFile) {
 | 
			
		||||
        if (sourceFile && ts.isExternalModule(sourceFile)) {
 | 
			
		||||
            const packageName = this._getPackageName(sourceFile);
 | 
			
		||||
            if (this._collector.bundledPackageNames.has(packageName)) {
 | 
			
		||||
                // The api-extractor.json config file has a "bundledPackages" setting, which causes imports from
 | 
			
		||||
                // certain NPM packages to be treated as part of the working project.  In this case, we need to
 | 
			
		||||
                // substitute the working package name.
 | 
			
		||||
                return new DeclarationReference_1.ModuleSource(this._collector.workingPackage.name);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                return new DeclarationReference_1.ModuleSource(packageName);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return DeclarationReference_1.GlobalSource.instance;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
DeclarationReferenceGenerator.unknownReference = '?';
 | 
			
		||||
exports.DeclarationReferenceGenerator = DeclarationReferenceGenerator;
 | 
			
		||||
//# sourceMappingURL=DeclarationReferenceGenerator.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DeclarationReferenceGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										16
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
import type { CollectorEntity } from '../collector/CollectorEntity';
 | 
			
		||||
import { AstImport } from '../analyzer/AstImport';
 | 
			
		||||
import { AstDeclaration } from '../analyzer/AstDeclaration';
 | 
			
		||||
import type { Collector } from '../collector/Collector';
 | 
			
		||||
import type { Span } from '../analyzer/Span';
 | 
			
		||||
import type { IndentedWriter } from './IndentedWriter';
 | 
			
		||||
/**
 | 
			
		||||
 * Some common code shared between DtsRollupGenerator and ApiReportGenerator.
 | 
			
		||||
 */
 | 
			
		||||
export declare class DtsEmitHelpers {
 | 
			
		||||
    static emitImport(writer: IndentedWriter, collectorEntity: CollectorEntity, astImport: AstImport): void;
 | 
			
		||||
    static emitNamedExport(writer: IndentedWriter, exportName: string, collectorEntity: CollectorEntity): void;
 | 
			
		||||
    static emitStarExports(writer: IndentedWriter, collector: Collector): void;
 | 
			
		||||
    static modifyImportTypeSpan(collector: Collector, span: Span, astDeclaration: AstDeclaration, modifyNestedSpan: (childSpan: Span, childAstDeclaration: AstDeclaration) => void): void;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=DtsEmitHelpers.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"DtsEmitHelpers.d.ts","sourceRoot":"","sources":["../../src/generators/DtsEmitHelpers.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAiB,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD;;GAEG;AACH,qBAAa,cAAc;WACX,UAAU,CACtB,MAAM,EAAE,cAAc,EACtB,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,SAAS,GACnB,IAAI;WAkDO,eAAe,CAC3B,MAAM,EAAE,cAAc,EACtB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,eAAe,GAC/B,IAAI;WAUO,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;WASnE,oBAAoB,CAChC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,IAAI,EACV,cAAc,EAAE,cAAc,EAC9B,gBAAgB,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,mBAAmB,EAAE,cAAc,KAAK,IAAI,GAC/E,IAAI;CAwER"}
 | 
			
		||||
							
								
								
									
										155
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,155 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.DtsEmitHelpers = void 0;
 | 
			
		||||
const ts = __importStar(require("typescript"));
 | 
			
		||||
const node_core_library_1 = require("@rushstack/node-core-library");
 | 
			
		||||
const AstImport_1 = require("../analyzer/AstImport");
 | 
			
		||||
const AstDeclaration_1 = require("../analyzer/AstDeclaration");
 | 
			
		||||
const SourceFileLocationFormatter_1 = require("../analyzer/SourceFileLocationFormatter");
 | 
			
		||||
/**
 | 
			
		||||
 * Some common code shared between DtsRollupGenerator and ApiReportGenerator.
 | 
			
		||||
 */
 | 
			
		||||
class DtsEmitHelpers {
 | 
			
		||||
    static emitImport(writer, collectorEntity, astImport) {
 | 
			
		||||
        const importPrefix = astImport.isTypeOnlyEverywhere ? 'import type' : 'import';
 | 
			
		||||
        switch (astImport.importKind) {
 | 
			
		||||
            case AstImport_1.AstImportKind.DefaultImport:
 | 
			
		||||
                if (collectorEntity.nameForEmit !== astImport.exportName) {
 | 
			
		||||
                    writer.write(`${importPrefix} { default as ${collectorEntity.nameForEmit} }`);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    writer.write(`${importPrefix} ${astImport.exportName}`);
 | 
			
		||||
                }
 | 
			
		||||
                writer.writeLine(` from '${astImport.modulePath}';`);
 | 
			
		||||
                break;
 | 
			
		||||
            case AstImport_1.AstImportKind.NamedImport:
 | 
			
		||||
                if (collectorEntity.nameForEmit === astImport.exportName) {
 | 
			
		||||
                    writer.write(`${importPrefix} { ${astImport.exportName} }`);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    writer.write(`${importPrefix} { ${astImport.exportName} as ${collectorEntity.nameForEmit} }`);
 | 
			
		||||
                }
 | 
			
		||||
                writer.writeLine(` from '${astImport.modulePath}';`);
 | 
			
		||||
                break;
 | 
			
		||||
            case AstImport_1.AstImportKind.StarImport:
 | 
			
		||||
                writer.writeLine(`${importPrefix} * as ${collectorEntity.nameForEmit} from '${astImport.modulePath}';`);
 | 
			
		||||
                break;
 | 
			
		||||
            case AstImport_1.AstImportKind.EqualsImport:
 | 
			
		||||
                writer.writeLine(`${importPrefix} ${collectorEntity.nameForEmit} = require('${astImport.modulePath}');`);
 | 
			
		||||
                break;
 | 
			
		||||
            case AstImport_1.AstImportKind.ImportType:
 | 
			
		||||
                if (!astImport.exportName) {
 | 
			
		||||
                    writer.writeLine(`${importPrefix} * as ${collectorEntity.nameForEmit} from '${astImport.modulePath}';`);
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    const topExportName = astImport.exportName.split('.')[0];
 | 
			
		||||
                    if (collectorEntity.nameForEmit === topExportName) {
 | 
			
		||||
                        writer.write(`${importPrefix} { ${topExportName} }`);
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        writer.write(`${importPrefix} { ${topExportName} as ${collectorEntity.nameForEmit} }`);
 | 
			
		||||
                    }
 | 
			
		||||
                    writer.writeLine(` from '${astImport.modulePath}';`);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                throw new node_core_library_1.InternalError('Unimplemented AstImportKind');
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static emitNamedExport(writer, exportName, collectorEntity) {
 | 
			
		||||
        if (exportName === ts.InternalSymbolName.Default) {
 | 
			
		||||
            writer.writeLine(`export default ${collectorEntity.nameForEmit};`);
 | 
			
		||||
        }
 | 
			
		||||
        else if (collectorEntity.nameForEmit !== exportName) {
 | 
			
		||||
            writer.writeLine(`export { ${collectorEntity.nameForEmit} as ${exportName} }`);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            writer.writeLine(`export { ${exportName} }`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static emitStarExports(writer, collector) {
 | 
			
		||||
        if (collector.starExportedExternalModulePaths.length > 0) {
 | 
			
		||||
            writer.writeLine();
 | 
			
		||||
            for (const starExportedExternalModulePath of collector.starExportedExternalModulePaths) {
 | 
			
		||||
                writer.writeLine(`export * from "${starExportedExternalModulePath}";`);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static modifyImportTypeSpan(collector, span, astDeclaration, modifyNestedSpan) {
 | 
			
		||||
        var _a, _b, _c, _d;
 | 
			
		||||
        const node = span.node;
 | 
			
		||||
        const referencedEntity = collector.tryGetEntityForNode(node);
 | 
			
		||||
        if (referencedEntity) {
 | 
			
		||||
            if (!referencedEntity.nameForEmit) {
 | 
			
		||||
                // This should never happen
 | 
			
		||||
                throw new node_core_library_1.InternalError('referencedEntry.nameForEmit is undefined');
 | 
			
		||||
            }
 | 
			
		||||
            let typeArgumentsText = '';
 | 
			
		||||
            if (node.typeArguments && node.typeArguments.length > 0) {
 | 
			
		||||
                // Type arguments have to be processed and written to the document
 | 
			
		||||
                const lessThanTokenPos = span.children.findIndex((childSpan) => childSpan.node.kind === ts.SyntaxKind.LessThanToken);
 | 
			
		||||
                const greaterThanTokenPos = span.children.findIndex((childSpan) => childSpan.node.kind === ts.SyntaxKind.GreaterThanToken);
 | 
			
		||||
                if (lessThanTokenPos < 0 || greaterThanTokenPos <= lessThanTokenPos) {
 | 
			
		||||
                    throw new node_core_library_1.InternalError(`Invalid type arguments: ${node.getText()}\n` +
 | 
			
		||||
                        SourceFileLocationFormatter_1.SourceFileLocationFormatter.formatDeclaration(node));
 | 
			
		||||
                }
 | 
			
		||||
                const typeArgumentsSpans = span.children.slice(lessThanTokenPos + 1, greaterThanTokenPos);
 | 
			
		||||
                // Apply modifications to Span elements of typeArguments
 | 
			
		||||
                typeArgumentsSpans.forEach((childSpan) => {
 | 
			
		||||
                    const childAstDeclaration = AstDeclaration_1.AstDeclaration.isSupportedSyntaxKind(childSpan.kind)
 | 
			
		||||
                        ? collector.astSymbolTable.getChildAstDeclarationByNode(childSpan.node, astDeclaration)
 | 
			
		||||
                        : astDeclaration;
 | 
			
		||||
                    modifyNestedSpan(childSpan, childAstDeclaration);
 | 
			
		||||
                });
 | 
			
		||||
                const typeArgumentsStrings = typeArgumentsSpans.map((childSpan) => childSpan.getModifiedText());
 | 
			
		||||
                typeArgumentsText = `<${typeArgumentsStrings.join(', ')}>`;
 | 
			
		||||
            }
 | 
			
		||||
            const separatorAfter = (_b = (_a = /(\s*)$/.exec(span.getText())) === null || _a === void 0 ? void 0 : _a[1]) !== null && _b !== void 0 ? _b : '';
 | 
			
		||||
            if (referencedEntity.astEntity instanceof AstImport_1.AstImport &&
 | 
			
		||||
                referencedEntity.astEntity.importKind === AstImport_1.AstImportKind.ImportType &&
 | 
			
		||||
                referencedEntity.astEntity.exportName) {
 | 
			
		||||
                // For an ImportType with a namespace chain, only the top namespace is imported.
 | 
			
		||||
                // Must add the original nested qualifiers to the rolled up import.
 | 
			
		||||
                const qualifiersText = (_d = (_c = node.qualifier) === null || _c === void 0 ? void 0 : _c.getText()) !== null && _d !== void 0 ? _d : '';
 | 
			
		||||
                const nestedQualifiersStart = qualifiersText.indexOf('.');
 | 
			
		||||
                // Including the leading "."
 | 
			
		||||
                const nestedQualifiersText = nestedQualifiersStart >= 0 ? qualifiersText.substring(nestedQualifiersStart) : '';
 | 
			
		||||
                const replacement = `${referencedEntity.nameForEmit}${nestedQualifiersText}${typeArgumentsText}${separatorAfter}`;
 | 
			
		||||
                span.modification.skipAll();
 | 
			
		||||
                span.modification.prefix = replacement;
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                // Replace with internal symbol or AstImport
 | 
			
		||||
                span.modification.skipAll();
 | 
			
		||||
                span.modification.prefix = `${referencedEntity.nameForEmit}${typeArgumentsText}${separatorAfter}`;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.DtsEmitHelpers = DtsEmitHelpers;
 | 
			
		||||
//# sourceMappingURL=DtsEmitHelpers.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsEmitHelpers.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										45
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,45 @@
 | 
			
		||||
import { type NewlineKind } from '@rushstack/node-core-library';
 | 
			
		||||
import type { Collector } from '../collector/Collector';
 | 
			
		||||
/**
 | 
			
		||||
 * Used with DtsRollupGenerator.writeTypingsFile()
 | 
			
		||||
 */
 | 
			
		||||
export declare enum DtsRollupKind {
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for an internal release, or for the trimming=false mode.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point.
 | 
			
		||||
     */
 | 
			
		||||
    InternalRelease = 0,
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for a preview release.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point,
 | 
			
		||||
     * except definitions marked as \@internal.
 | 
			
		||||
     */
 | 
			
		||||
    AlphaRelease = 1,
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for a preview release.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point,
 | 
			
		||||
     * except definitions marked as \@alpha or \@internal.
 | 
			
		||||
     */
 | 
			
		||||
    BetaRelease = 2,
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for a public release.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point,
 | 
			
		||||
     * except definitions marked as \@beta, \@alpha, or \@internal.
 | 
			
		||||
     */
 | 
			
		||||
    PublicRelease = 3
 | 
			
		||||
}
 | 
			
		||||
export declare class DtsRollupGenerator {
 | 
			
		||||
    /**
 | 
			
		||||
     * Generates the typings file and writes it to disk.
 | 
			
		||||
     *
 | 
			
		||||
     * @param dtsFilename    - The *.d.ts output filename
 | 
			
		||||
     */
 | 
			
		||||
    static writeTypingsFile(collector: Collector, dtsFilename: string, dtsKind: DtsRollupKind, newlineKind: NewlineKind): void;
 | 
			
		||||
    private static _generateTypingsFileContent;
 | 
			
		||||
    /**
 | 
			
		||||
     * Before writing out a declaration, _modifySpan() applies various fixups to make it nice.
 | 
			
		||||
     */
 | 
			
		||||
    private static _modifySpan;
 | 
			
		||||
    private static _shouldIncludeReleaseTag;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=DtsRollupGenerator.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"DtsRollupGenerator.d.ts","sourceRoot":"","sources":["../../src/generators/DtsRollupGenerator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,KAAK,WAAW,EAAiB,MAAM,8BAA8B,CAAC;AAG3F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAiBxD;;GAEG;AACH,oBAAY,aAAa;IACvB;;;OAGG;IACH,eAAe,IAAA;IAEf;;;;OAIG;IACH,YAAY,IAAA;IAEZ;;;;OAIG;IACH,WAAW,IAAA;IAEX;;;;OAIG;IACH,aAAa,IAAA;CACd;AAED,qBAAa,kBAAkB;IAC7B;;;;OAIG;WACW,gBAAgB,CAC5B,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,WAAW,GACvB,IAAI;IAYP,OAAO,CAAC,MAAM,CAAC,2BAA2B;IA4K1C;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IA6M1B,OAAO,CAAC,MAAM,CAAC,wBAAwB;CAyBxC"}
 | 
			
		||||
							
								
								
									
										416
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,416 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.DtsRollupGenerator = exports.DtsRollupKind = void 0;
 | 
			
		||||
/* eslint-disable no-bitwise */
 | 
			
		||||
const ts = __importStar(require("typescript"));
 | 
			
		||||
const node_core_library_1 = require("@rushstack/node-core-library");
 | 
			
		||||
const api_extractor_model_1 = require("@microsoft/api-extractor-model");
 | 
			
		||||
const TypeScriptHelpers_1 = require("../analyzer/TypeScriptHelpers");
 | 
			
		||||
const Span_1 = require("../analyzer/Span");
 | 
			
		||||
const AstImport_1 = require("../analyzer/AstImport");
 | 
			
		||||
const AstDeclaration_1 = require("../analyzer/AstDeclaration");
 | 
			
		||||
const AstSymbol_1 = require("../analyzer/AstSymbol");
 | 
			
		||||
const IndentedWriter_1 = require("./IndentedWriter");
 | 
			
		||||
const DtsEmitHelpers_1 = require("./DtsEmitHelpers");
 | 
			
		||||
const AstNamespaceImport_1 = require("../analyzer/AstNamespaceImport");
 | 
			
		||||
const SourceFileLocationFormatter_1 = require("../analyzer/SourceFileLocationFormatter");
 | 
			
		||||
/**
 | 
			
		||||
 * Used with DtsRollupGenerator.writeTypingsFile()
 | 
			
		||||
 */
 | 
			
		||||
var DtsRollupKind;
 | 
			
		||||
(function (DtsRollupKind) {
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for an internal release, or for the trimming=false mode.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point.
 | 
			
		||||
     */
 | 
			
		||||
    DtsRollupKind[DtsRollupKind["InternalRelease"] = 0] = "InternalRelease";
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for a preview release.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point,
 | 
			
		||||
     * except definitions marked as \@internal.
 | 
			
		||||
     */
 | 
			
		||||
    DtsRollupKind[DtsRollupKind["AlphaRelease"] = 1] = "AlphaRelease";
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for a preview release.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point,
 | 
			
		||||
     * except definitions marked as \@alpha or \@internal.
 | 
			
		||||
     */
 | 
			
		||||
    DtsRollupKind[DtsRollupKind["BetaRelease"] = 2] = "BetaRelease";
 | 
			
		||||
    /**
 | 
			
		||||
     * Generate a *.d.ts file for a public release.
 | 
			
		||||
     * This output file will contain all definitions that are reachable from the entry point,
 | 
			
		||||
     * except definitions marked as \@beta, \@alpha, or \@internal.
 | 
			
		||||
     */
 | 
			
		||||
    DtsRollupKind[DtsRollupKind["PublicRelease"] = 3] = "PublicRelease";
 | 
			
		||||
})(DtsRollupKind = exports.DtsRollupKind || (exports.DtsRollupKind = {}));
 | 
			
		||||
class DtsRollupGenerator {
 | 
			
		||||
    /**
 | 
			
		||||
     * Generates the typings file and writes it to disk.
 | 
			
		||||
     *
 | 
			
		||||
     * @param dtsFilename    - The *.d.ts output filename
 | 
			
		||||
     */
 | 
			
		||||
    static writeTypingsFile(collector, dtsFilename, dtsKind, newlineKind) {
 | 
			
		||||
        const writer = new IndentedWriter_1.IndentedWriter();
 | 
			
		||||
        writer.trimLeadingSpaces = true;
 | 
			
		||||
        DtsRollupGenerator._generateTypingsFileContent(collector, writer, dtsKind);
 | 
			
		||||
        node_core_library_1.FileSystem.writeFile(dtsFilename, writer.toString(), {
 | 
			
		||||
            convertLineEndings: newlineKind,
 | 
			
		||||
            ensureFolderExists: true
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    static _generateTypingsFileContent(collector, writer, dtsKind) {
 | 
			
		||||
        // Emit the @packageDocumentation comment at the top of the file
 | 
			
		||||
        if (collector.workingPackage.tsdocParserContext) {
 | 
			
		||||
            writer.trimLeadingSpaces = false;
 | 
			
		||||
            writer.writeLine(collector.workingPackage.tsdocParserContext.sourceRange.toString());
 | 
			
		||||
            writer.trimLeadingSpaces = true;
 | 
			
		||||
            writer.ensureSkippedLine();
 | 
			
		||||
        }
 | 
			
		||||
        // Emit the triple slash directives
 | 
			
		||||
        for (const typeDirectiveReference of collector.dtsTypeReferenceDirectives) {
 | 
			
		||||
            // https://github.com/microsoft/TypeScript/blob/611ebc7aadd7a44a4c0447698bfda9222a78cb66/src/compiler/declarationEmitter.ts#L162
 | 
			
		||||
            writer.writeLine(`/// <reference types="${typeDirectiveReference}" />`);
 | 
			
		||||
        }
 | 
			
		||||
        for (const libDirectiveReference of collector.dtsLibReferenceDirectives) {
 | 
			
		||||
            writer.writeLine(`/// <reference lib="${libDirectiveReference}" />`);
 | 
			
		||||
        }
 | 
			
		||||
        writer.ensureSkippedLine();
 | 
			
		||||
        // Emit the imports
 | 
			
		||||
        for (const entity of collector.entities) {
 | 
			
		||||
            if (entity.astEntity instanceof AstImport_1.AstImport) {
 | 
			
		||||
                const astImport = entity.astEntity;
 | 
			
		||||
                // For example, if the imported API comes from an external package that supports AEDoc,
 | 
			
		||||
                // and it was marked as `@internal`, then don't emit it.
 | 
			
		||||
                const symbolMetadata = collector.tryFetchMetadataForAstEntity(astImport);
 | 
			
		||||
                const maxEffectiveReleaseTag = symbolMetadata
 | 
			
		||||
                    ? symbolMetadata.maxEffectiveReleaseTag
 | 
			
		||||
                    : api_extractor_model_1.ReleaseTag.None;
 | 
			
		||||
                if (this._shouldIncludeReleaseTag(maxEffectiveReleaseTag, dtsKind)) {
 | 
			
		||||
                    DtsEmitHelpers_1.DtsEmitHelpers.emitImport(writer, entity, astImport);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        writer.ensureSkippedLine();
 | 
			
		||||
        // Emit the regular declarations
 | 
			
		||||
        for (const entity of collector.entities) {
 | 
			
		||||
            const astEntity = entity.astEntity;
 | 
			
		||||
            const symbolMetadata = collector.tryFetchMetadataForAstEntity(astEntity);
 | 
			
		||||
            const maxEffectiveReleaseTag = symbolMetadata
 | 
			
		||||
                ? symbolMetadata.maxEffectiveReleaseTag
 | 
			
		||||
                : api_extractor_model_1.ReleaseTag.None;
 | 
			
		||||
            if (!this._shouldIncludeReleaseTag(maxEffectiveReleaseTag, dtsKind)) {
 | 
			
		||||
                if (!collector.extractorConfig.omitTrimmingComments) {
 | 
			
		||||
                    writer.ensureSkippedLine();
 | 
			
		||||
                    writer.writeLine(`/* Excluded from this release type: ${entity.nameForEmit} */`);
 | 
			
		||||
                }
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (astEntity instanceof AstSymbol_1.AstSymbol) {
 | 
			
		||||
                // Emit all the declarations for this entry
 | 
			
		||||
                for (const astDeclaration of astEntity.astDeclarations || []) {
 | 
			
		||||
                    const apiItemMetadata = collector.fetchApiItemMetadata(astDeclaration);
 | 
			
		||||
                    if (!this._shouldIncludeReleaseTag(apiItemMetadata.effectiveReleaseTag, dtsKind)) {
 | 
			
		||||
                        if (!collector.extractorConfig.omitTrimmingComments) {
 | 
			
		||||
                            writer.ensureSkippedLine();
 | 
			
		||||
                            writer.writeLine(`/* Excluded declaration from this release type: ${entity.nameForEmit} */`);
 | 
			
		||||
                        }
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        const span = new Span_1.Span(astDeclaration.declaration);
 | 
			
		||||
                        DtsRollupGenerator._modifySpan(collector, span, entity, astDeclaration, dtsKind);
 | 
			
		||||
                        writer.ensureSkippedLine();
 | 
			
		||||
                        span.writeModifiedText(writer);
 | 
			
		||||
                        writer.ensureNewLine();
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (astEntity instanceof AstNamespaceImport_1.AstNamespaceImport) {
 | 
			
		||||
                const astModuleExportInfo = astEntity.fetchAstModuleExportInfo(collector);
 | 
			
		||||
                if (entity.nameForEmit === undefined) {
 | 
			
		||||
                    // This should never happen
 | 
			
		||||
                    throw new node_core_library_1.InternalError('referencedEntry.nameForEmit is undefined');
 | 
			
		||||
                }
 | 
			
		||||
                if (astModuleExportInfo.starExportedExternalModules.size > 0) {
 | 
			
		||||
                    // We could support this, but we would need to find a way to safely represent it.
 | 
			
		||||
                    throw new Error(`The ${entity.nameForEmit} namespace import includes a start export, which is not supported:\n` +
 | 
			
		||||
                        SourceFileLocationFormatter_1.SourceFileLocationFormatter.formatDeclaration(astEntity.declaration));
 | 
			
		||||
                }
 | 
			
		||||
                // Emit a synthetic declaration for the namespace.  It will look like this:
 | 
			
		||||
                //
 | 
			
		||||
                //    declare namespace example {
 | 
			
		||||
                //      export {
 | 
			
		||||
                //        f1,
 | 
			
		||||
                //        f2
 | 
			
		||||
                //      }
 | 
			
		||||
                //    }
 | 
			
		||||
                //
 | 
			
		||||
                // Note that we do not try to relocate f1()/f2() to be inside the namespace because other type
 | 
			
		||||
                // signatures may reference them directly (without using the namespace qualifier).
 | 
			
		||||
                writer.ensureSkippedLine();
 | 
			
		||||
                if (entity.shouldInlineExport) {
 | 
			
		||||
                    writer.write('export ');
 | 
			
		||||
                }
 | 
			
		||||
                writer.writeLine(`declare namespace ${entity.nameForEmit} {`);
 | 
			
		||||
                // all local exports of local imported module are just references to top-level declarations
 | 
			
		||||
                writer.increaseIndent();
 | 
			
		||||
                writer.writeLine('export {');
 | 
			
		||||
                writer.increaseIndent();
 | 
			
		||||
                const exportClauses = [];
 | 
			
		||||
                for (const [exportedName, exportedEntity] of astModuleExportInfo.exportedLocalEntities) {
 | 
			
		||||
                    const collectorEntity = collector.tryGetCollectorEntity(exportedEntity);
 | 
			
		||||
                    if (collectorEntity === undefined) {
 | 
			
		||||
                        // This should never happen
 | 
			
		||||
                        // top-level exports of local imported module should be added as collector entities before
 | 
			
		||||
                        throw new node_core_library_1.InternalError(`Cannot find collector entity for ${entity.nameForEmit}.${exportedEntity.localName}`);
 | 
			
		||||
                    }
 | 
			
		||||
                    // If the entity's declaration won't be included, then neither should the namespace export it
 | 
			
		||||
                    // This fixes the issue encountered here: https://github.com/microsoft/rushstack/issues/2791
 | 
			
		||||
                    const exportedSymbolMetadata = collector.tryFetchMetadataForAstEntity(exportedEntity);
 | 
			
		||||
                    const exportedMaxEffectiveReleaseTag = exportedSymbolMetadata
 | 
			
		||||
                        ? exportedSymbolMetadata.maxEffectiveReleaseTag
 | 
			
		||||
                        : api_extractor_model_1.ReleaseTag.None;
 | 
			
		||||
                    if (!this._shouldIncludeReleaseTag(exportedMaxEffectiveReleaseTag, dtsKind)) {
 | 
			
		||||
                        continue;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (collectorEntity.nameForEmit === exportedName) {
 | 
			
		||||
                        exportClauses.push(collectorEntity.nameForEmit);
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        exportClauses.push(`${collectorEntity.nameForEmit} as ${exportedName}`);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                writer.writeLine(exportClauses.join(',\n'));
 | 
			
		||||
                writer.decreaseIndent();
 | 
			
		||||
                writer.writeLine('}'); // end of "export { ... }"
 | 
			
		||||
                writer.decreaseIndent();
 | 
			
		||||
                writer.writeLine('}'); // end of "declare namespace { ... }"
 | 
			
		||||
            }
 | 
			
		||||
            if (!entity.shouldInlineExport) {
 | 
			
		||||
                for (const exportName of entity.exportNames) {
 | 
			
		||||
                    DtsEmitHelpers_1.DtsEmitHelpers.emitNamedExport(writer, exportName, entity);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            writer.ensureSkippedLine();
 | 
			
		||||
        }
 | 
			
		||||
        DtsEmitHelpers_1.DtsEmitHelpers.emitStarExports(writer, collector);
 | 
			
		||||
        // Emit "export { }" which is a special directive that prevents consumers from importing declarations
 | 
			
		||||
        // that don't have an explicit "export" modifier.
 | 
			
		||||
        writer.ensureSkippedLine();
 | 
			
		||||
        writer.writeLine('export { }');
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Before writing out a declaration, _modifySpan() applies various fixups to make it nice.
 | 
			
		||||
     */
 | 
			
		||||
    static _modifySpan(collector, span, entity, astDeclaration, dtsKind) {
 | 
			
		||||
        const previousSpan = span.previousSibling;
 | 
			
		||||
        let recurseChildren = true;
 | 
			
		||||
        switch (span.kind) {
 | 
			
		||||
            case ts.SyntaxKind.JSDocComment:
 | 
			
		||||
                // If the @packageDocumentation comment seems to be attached to one of the regular API items,
 | 
			
		||||
                // omit it.  It gets explictly emitted at the top of the file.
 | 
			
		||||
                if (span.node.getText().match(/(?:\s|\*)@packageDocumentation(?:\s|\*)/gi)) {
 | 
			
		||||
                    span.modification.skipAll();
 | 
			
		||||
                }
 | 
			
		||||
                // For now, we don't transform JSDoc comment nodes at all
 | 
			
		||||
                recurseChildren = false;
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ExportKeyword:
 | 
			
		||||
            case ts.SyntaxKind.DefaultKeyword:
 | 
			
		||||
            case ts.SyntaxKind.DeclareKeyword:
 | 
			
		||||
                // Delete any explicit "export" or "declare" keywords -- we will re-add them below
 | 
			
		||||
                span.modification.skipAll();
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.InterfaceKeyword:
 | 
			
		||||
            case ts.SyntaxKind.ClassKeyword:
 | 
			
		||||
            case ts.SyntaxKind.EnumKeyword:
 | 
			
		||||
            case ts.SyntaxKind.NamespaceKeyword:
 | 
			
		||||
            case ts.SyntaxKind.ModuleKeyword:
 | 
			
		||||
            case ts.SyntaxKind.TypeKeyword:
 | 
			
		||||
            case ts.SyntaxKind.FunctionKeyword:
 | 
			
		||||
                // Replace the stuff we possibly deleted above
 | 
			
		||||
                let replacedModifiers = '';
 | 
			
		||||
                // Add a declare statement for root declarations (but not for nested declarations)
 | 
			
		||||
                if (!astDeclaration.parent) {
 | 
			
		||||
                    replacedModifiers += 'declare ';
 | 
			
		||||
                }
 | 
			
		||||
                if (entity.shouldInlineExport) {
 | 
			
		||||
                    replacedModifiers = 'export ' + replacedModifiers;
 | 
			
		||||
                }
 | 
			
		||||
                if (previousSpan && previousSpan.kind === ts.SyntaxKind.SyntaxList) {
 | 
			
		||||
                    // If there is a previous span of type SyntaxList, then apply it before any other modifiers
 | 
			
		||||
                    // (e.g. "abstract") that appear there.
 | 
			
		||||
                    previousSpan.modification.prefix = replacedModifiers + previousSpan.modification.prefix;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    // Otherwise just stick it in front of this span
 | 
			
		||||
                    span.modification.prefix = replacedModifiers + span.modification.prefix;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.VariableDeclaration:
 | 
			
		||||
                // Is this a top-level variable declaration?
 | 
			
		||||
                // (The logic below does not apply to variable declarations that are part of an explicit "namespace" block,
 | 
			
		||||
                // since the compiler prefers not to emit "declare" or "export" keywords for those declarations.)
 | 
			
		||||
                if (!span.parent) {
 | 
			
		||||
                    // The VariableDeclaration node is part of a VariableDeclarationList, however
 | 
			
		||||
                    // the Entry.followedSymbol points to the VariableDeclaration part because
 | 
			
		||||
                    // multiple definitions might share the same VariableDeclarationList.
 | 
			
		||||
                    //
 | 
			
		||||
                    // Since we are emitting a separate declaration for each one, we need to look upwards
 | 
			
		||||
                    // in the ts.Node tree and write a copy of the enclosing VariableDeclarationList
 | 
			
		||||
                    // content (e.g. "var" from "var x=1, y=2").
 | 
			
		||||
                    const list = TypeScriptHelpers_1.TypeScriptHelpers.matchAncestor(span.node, [
 | 
			
		||||
                        ts.SyntaxKind.VariableDeclarationList,
 | 
			
		||||
                        ts.SyntaxKind.VariableDeclaration
 | 
			
		||||
                    ]);
 | 
			
		||||
                    if (!list) {
 | 
			
		||||
                        // This should not happen unless the compiler API changes somehow
 | 
			
		||||
                        throw new node_core_library_1.InternalError('Unsupported variable declaration');
 | 
			
		||||
                    }
 | 
			
		||||
                    const listPrefix = list
 | 
			
		||||
                        .getSourceFile()
 | 
			
		||||
                        .text.substring(list.getStart(), list.declarations[0].getStart());
 | 
			
		||||
                    span.modification.prefix = 'declare ' + listPrefix + span.modification.prefix;
 | 
			
		||||
                    span.modification.suffix = ';';
 | 
			
		||||
                    if (entity.shouldInlineExport) {
 | 
			
		||||
                        span.modification.prefix = 'export ' + span.modification.prefix;
 | 
			
		||||
                    }
 | 
			
		||||
                    const declarationMetadata = collector.fetchDeclarationMetadata(astDeclaration);
 | 
			
		||||
                    if (declarationMetadata.tsdocParserContext) {
 | 
			
		||||
                        // Typically the comment for a variable declaration is attached to the outer variable statement
 | 
			
		||||
                        // (which may possibly contain multiple variable declarations), so it's not part of the Span.
 | 
			
		||||
                        // Instead we need to manually inject it.
 | 
			
		||||
                        let originalComment = declarationMetadata.tsdocParserContext.sourceRange.toString();
 | 
			
		||||
                        if (!/\r?\n\s*$/.test(originalComment)) {
 | 
			
		||||
                            originalComment += '\n';
 | 
			
		||||
                        }
 | 
			
		||||
                        span.modification.indentDocComment = Span_1.IndentDocCommentScope.PrefixOnly;
 | 
			
		||||
                        span.modification.prefix = originalComment + span.modification.prefix;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.Identifier:
 | 
			
		||||
                {
 | 
			
		||||
                    const referencedEntity = collector.tryGetEntityForNode(span.node);
 | 
			
		||||
                    if (referencedEntity) {
 | 
			
		||||
                        if (!referencedEntity.nameForEmit) {
 | 
			
		||||
                            // This should never happen
 | 
			
		||||
                            throw new node_core_library_1.InternalError('referencedEntry.nameForEmit is undefined');
 | 
			
		||||
                        }
 | 
			
		||||
                        span.modification.prefix = referencedEntity.nameForEmit;
 | 
			
		||||
                        // For debugging:
 | 
			
		||||
                        // span.modification.prefix += '/*R=FIX*/';
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                        // For debugging:
 | 
			
		||||
                        // span.modification.prefix += '/*R=KEEP*/';
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ImportType:
 | 
			
		||||
                DtsEmitHelpers_1.DtsEmitHelpers.modifyImportTypeSpan(collector, span, astDeclaration, (childSpan, childAstDeclaration) => {
 | 
			
		||||
                    DtsRollupGenerator._modifySpan(collector, childSpan, entity, childAstDeclaration, dtsKind);
 | 
			
		||||
                });
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        if (recurseChildren) {
 | 
			
		||||
            for (const child of span.children) {
 | 
			
		||||
                let childAstDeclaration = astDeclaration;
 | 
			
		||||
                // Should we trim this node?
 | 
			
		||||
                let trimmed = false;
 | 
			
		||||
                if (AstDeclaration_1.AstDeclaration.isSupportedSyntaxKind(child.kind)) {
 | 
			
		||||
                    childAstDeclaration = collector.astSymbolTable.getChildAstDeclarationByNode(child.node, astDeclaration);
 | 
			
		||||
                    const releaseTag = collector.fetchApiItemMetadata(childAstDeclaration).effectiveReleaseTag;
 | 
			
		||||
                    if (!this._shouldIncludeReleaseTag(releaseTag, dtsKind)) {
 | 
			
		||||
                        let nodeToTrim = child;
 | 
			
		||||
                        // If we are trimming a variable statement, then we need to trim the outer VariableDeclarationList
 | 
			
		||||
                        // as well.
 | 
			
		||||
                        if (child.kind === ts.SyntaxKind.VariableDeclaration) {
 | 
			
		||||
                            const variableStatement = child.findFirstParent(ts.SyntaxKind.VariableStatement);
 | 
			
		||||
                            if (variableStatement !== undefined) {
 | 
			
		||||
                                nodeToTrim = variableStatement;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        const modification = nodeToTrim.modification;
 | 
			
		||||
                        // Yes, trim it and stop here
 | 
			
		||||
                        const name = childAstDeclaration.astSymbol.localName;
 | 
			
		||||
                        modification.omitChildren = true;
 | 
			
		||||
                        if (!collector.extractorConfig.omitTrimmingComments) {
 | 
			
		||||
                            modification.prefix = `/* Excluded from this release type: ${name} */`;
 | 
			
		||||
                        }
 | 
			
		||||
                        else {
 | 
			
		||||
                            modification.prefix = '';
 | 
			
		||||
                        }
 | 
			
		||||
                        modification.suffix = '';
 | 
			
		||||
                        if (nodeToTrim.children.length > 0) {
 | 
			
		||||
                            // If there are grandchildren, then keep the last grandchild's separator,
 | 
			
		||||
                            // since it often has useful whitespace
 | 
			
		||||
                            modification.suffix = nodeToTrim.children[nodeToTrim.children.length - 1].separator;
 | 
			
		||||
                        }
 | 
			
		||||
                        if (nodeToTrim.nextSibling) {
 | 
			
		||||
                            // If the thing we are trimming is followed by a comma, then trim the comma also.
 | 
			
		||||
                            // An example would be an enum member.
 | 
			
		||||
                            if (nodeToTrim.nextSibling.kind === ts.SyntaxKind.CommaToken) {
 | 
			
		||||
                                // Keep its separator since it often has useful whitespace
 | 
			
		||||
                                modification.suffix += nodeToTrim.nextSibling.separator;
 | 
			
		||||
                                nodeToTrim.nextSibling.modification.skipAll();
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        trimmed = true;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (!trimmed) {
 | 
			
		||||
                    DtsRollupGenerator._modifySpan(collector, child, entity, childAstDeclaration, dtsKind);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static _shouldIncludeReleaseTag(releaseTag, dtsKind) {
 | 
			
		||||
        switch (dtsKind) {
 | 
			
		||||
            case DtsRollupKind.InternalRelease:
 | 
			
		||||
                return true;
 | 
			
		||||
            case DtsRollupKind.AlphaRelease:
 | 
			
		||||
                return (releaseTag === api_extractor_model_1.ReleaseTag.Alpha ||
 | 
			
		||||
                    releaseTag === api_extractor_model_1.ReleaseTag.Beta ||
 | 
			
		||||
                    releaseTag === api_extractor_model_1.ReleaseTag.Public ||
 | 
			
		||||
                    // NOTE: If the release tag is "None", then we don't have enough information to trim it
 | 
			
		||||
                    releaseTag === api_extractor_model_1.ReleaseTag.None);
 | 
			
		||||
            case DtsRollupKind.BetaRelease:
 | 
			
		||||
                return (releaseTag === api_extractor_model_1.ReleaseTag.Beta ||
 | 
			
		||||
                    releaseTag === api_extractor_model_1.ReleaseTag.Public ||
 | 
			
		||||
                    // NOTE: If the release tag is "None", then we don't have enough information to trim it
 | 
			
		||||
                    releaseTag === api_extractor_model_1.ReleaseTag.None);
 | 
			
		||||
            case DtsRollupKind.PublicRelease:
 | 
			
		||||
                return releaseTag === api_extractor_model_1.ReleaseTag.Public || releaseTag === api_extractor_model_1.ReleaseTag.None;
 | 
			
		||||
            default:
 | 
			
		||||
                throw new Error(`${DtsRollupKind[dtsKind]} is not implemented`);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.DtsRollupGenerator = DtsRollupGenerator;
 | 
			
		||||
//# sourceMappingURL=DtsRollupGenerator.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/DtsRollupGenerator.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										48
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,48 @@
 | 
			
		||||
import * as ts from 'typescript';
 | 
			
		||||
import { type IExcerptToken, type IExcerptTokenRange } from '@microsoft/api-extractor-model';
 | 
			
		||||
import type { DeclarationReferenceGenerator } from './DeclarationReferenceGenerator';
 | 
			
		||||
import type { AstDeclaration } from '../analyzer/AstDeclaration';
 | 
			
		||||
/**
 | 
			
		||||
 * Used to provide ExcerptBuilder with a list of nodes whose token range we want to capture.
 | 
			
		||||
 */
 | 
			
		||||
export interface IExcerptBuilderNodeToCapture {
 | 
			
		||||
    /**
 | 
			
		||||
     * The node to capture
 | 
			
		||||
     */
 | 
			
		||||
    node: ts.Node | undefined;
 | 
			
		||||
    /**
 | 
			
		||||
     * The token range whose startIndex/endIndex will be overwritten with the indexes for the
 | 
			
		||||
     * tokens corresponding to IExcerptBuilderNodeToCapture.node
 | 
			
		||||
     */
 | 
			
		||||
    tokenRange: IExcerptTokenRange;
 | 
			
		||||
}
 | 
			
		||||
export declare class ExcerptBuilder {
 | 
			
		||||
    /**
 | 
			
		||||
     * Appends a blank line to the `excerptTokens` list.
 | 
			
		||||
     * @param excerptTokens - The target token list to append to
 | 
			
		||||
     */
 | 
			
		||||
    static addBlankLine(excerptTokens: IExcerptToken[]): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Appends the signature for the specified `AstDeclaration` to the `excerptTokens` list.
 | 
			
		||||
     * @param excerptTokens - The target token list to append to
 | 
			
		||||
     * @param nodesToCapture - A list of child nodes whose token ranges we want to capture
 | 
			
		||||
     */
 | 
			
		||||
    static addDeclaration(excerptTokens: IExcerptToken[], astDeclaration: AstDeclaration, nodesToCapture: IExcerptBuilderNodeToCapture[], referenceGenerator: DeclarationReferenceGenerator): void;
 | 
			
		||||
    static createEmptyTokenRange(): IExcerptTokenRange;
 | 
			
		||||
    private static _buildSpan;
 | 
			
		||||
    private static _appendToken;
 | 
			
		||||
    /**
 | 
			
		||||
     * Condenses the provided excerpt tokens by merging tokens where possible. Updates the provided token ranges to
 | 
			
		||||
     * remain accurate after token merging.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For example, suppose we have excerpt tokens ["A", "B", "C"] and a token range [0, 2]. If the excerpt tokens
 | 
			
		||||
     * are condensed to ["AB", "C"], then the token range would be updated to [0, 1]. Note that merges are only
 | 
			
		||||
     * performed if they are compatible with the provided token ranges. In the example above, if our token range was
 | 
			
		||||
     * originally [0, 1], we would not be able to merge tokens "A" and "B".
 | 
			
		||||
     */
 | 
			
		||||
    private static _condenseTokens;
 | 
			
		||||
    private static _isDeclarationName;
 | 
			
		||||
    private static _isDeclaration;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=ExcerptBuilder.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"ExcerptBuilder.d.ts","sourceRoot":"","sources":["../../src/generators/ExcerptBuilder.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACxB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,4BAA4B;IAC3C;;OAEG;IACH,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,SAAS,CAAC;IAC1B;;;OAGG;IACH,UAAU,EAAE,kBAAkB,CAAC;CAChC;AAiCD,qBAAa,cAAc;IACzB;;;OAGG;WACW,YAAY,CAAC,aAAa,EAAE,aAAa,EAAE,GAAG,IAAI;IAYhE;;;;OAIG;WACW,cAAc,CAC1B,aAAa,EAAE,aAAa,EAAE,EAC9B,cAAc,EAAE,cAAc,EAC9B,cAAc,EAAE,4BAA4B,EAAE,EAC9C,kBAAkB,EAAE,6BAA6B,GAChD,IAAI;WAmCO,qBAAqB,IAAI,kBAAkB;IAIzD,OAAO,CAAC,MAAM,CAAC,UAAU;IA8EzB,OAAO,CAAC,MAAM,CAAC,YAAY;IAiB3B;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;IA8E9B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAIjC,OAAO,CAAC,MAAM,CAAC,cAAc;CA0B9B"}
 | 
			
		||||
							
								
								
									
										267
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										267
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,267 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    var desc = Object.getOwnPropertyDescriptor(m, k);
 | 
			
		||||
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
 | 
			
		||||
      desc = { enumerable: true, get: function() { return m[k]; } };
 | 
			
		||||
    }
 | 
			
		||||
    Object.defineProperty(o, k2, desc);
 | 
			
		||||
}) : (function(o, m, k, k2) {
 | 
			
		||||
    if (k2 === undefined) k2 = k;
 | 
			
		||||
    o[k2] = m[k];
 | 
			
		||||
}));
 | 
			
		||||
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
 | 
			
		||||
    Object.defineProperty(o, "default", { enumerable: true, value: v });
 | 
			
		||||
}) : function(o, v) {
 | 
			
		||||
    o["default"] = v;
 | 
			
		||||
});
 | 
			
		||||
var __importStar = (this && this.__importStar) || function (mod) {
 | 
			
		||||
    if (mod && mod.__esModule) return mod;
 | 
			
		||||
    var result = {};
 | 
			
		||||
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
 | 
			
		||||
    __setModuleDefault(result, mod);
 | 
			
		||||
    return result;
 | 
			
		||||
};
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.ExcerptBuilder = void 0;
 | 
			
		||||
const ts = __importStar(require("typescript"));
 | 
			
		||||
const api_extractor_model_1 = require("@microsoft/api-extractor-model");
 | 
			
		||||
const Span_1 = require("../analyzer/Span");
 | 
			
		||||
class ExcerptBuilder {
 | 
			
		||||
    /**
 | 
			
		||||
     * Appends a blank line to the `excerptTokens` list.
 | 
			
		||||
     * @param excerptTokens - The target token list to append to
 | 
			
		||||
     */
 | 
			
		||||
    static addBlankLine(excerptTokens) {
 | 
			
		||||
        let newlines = '\n\n';
 | 
			
		||||
        // If the existing text already ended with a newline, then only append one newline
 | 
			
		||||
        if (excerptTokens.length > 0) {
 | 
			
		||||
            const previousText = excerptTokens[excerptTokens.length - 1].text;
 | 
			
		||||
            if (/\n$/.test(previousText)) {
 | 
			
		||||
                newlines = '\n';
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        excerptTokens.push({ kind: api_extractor_model_1.ExcerptTokenKind.Content, text: newlines });
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Appends the signature for the specified `AstDeclaration` to the `excerptTokens` list.
 | 
			
		||||
     * @param excerptTokens - The target token list to append to
 | 
			
		||||
     * @param nodesToCapture - A list of child nodes whose token ranges we want to capture
 | 
			
		||||
     */
 | 
			
		||||
    static addDeclaration(excerptTokens, astDeclaration, nodesToCapture, referenceGenerator) {
 | 
			
		||||
        let stopBeforeChildKind = undefined;
 | 
			
		||||
        switch (astDeclaration.declaration.kind) {
 | 
			
		||||
            case ts.SyntaxKind.ClassDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.EnumDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.InterfaceDeclaration:
 | 
			
		||||
                // FirstPunctuation = "{"
 | 
			
		||||
                stopBeforeChildKind = ts.SyntaxKind.FirstPunctuation;
 | 
			
		||||
                break;
 | 
			
		||||
            case ts.SyntaxKind.ModuleDeclaration:
 | 
			
		||||
                // ModuleBlock = the "{ ... }" block
 | 
			
		||||
                stopBeforeChildKind = ts.SyntaxKind.ModuleBlock;
 | 
			
		||||
                break;
 | 
			
		||||
        }
 | 
			
		||||
        const span = new Span_1.Span(astDeclaration.declaration);
 | 
			
		||||
        const tokenRangesByNode = new Map();
 | 
			
		||||
        for (const excerpt of nodesToCapture || []) {
 | 
			
		||||
            if (excerpt.node) {
 | 
			
		||||
                tokenRangesByNode.set(excerpt.node, excerpt.tokenRange);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        ExcerptBuilder._buildSpan(excerptTokens, span, {
 | 
			
		||||
            referenceGenerator: referenceGenerator,
 | 
			
		||||
            startingNode: span.node,
 | 
			
		||||
            stopBeforeChildKind,
 | 
			
		||||
            tokenRangesByNode,
 | 
			
		||||
            lastAppendedTokenIsSeparator: false
 | 
			
		||||
        });
 | 
			
		||||
        ExcerptBuilder._condenseTokens(excerptTokens, [...tokenRangesByNode.values()]);
 | 
			
		||||
    }
 | 
			
		||||
    static createEmptyTokenRange() {
 | 
			
		||||
        return { startIndex: 0, endIndex: 0 };
 | 
			
		||||
    }
 | 
			
		||||
    static _buildSpan(excerptTokens, span, state) {
 | 
			
		||||
        if (span.kind === ts.SyntaxKind.JSDocComment) {
 | 
			
		||||
            // Discard any comments
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
        // Can this node start a excerpt?
 | 
			
		||||
        const capturedTokenRange = state.tokenRangesByNode.get(span.node);
 | 
			
		||||
        let excerptStartIndex = 0;
 | 
			
		||||
        if (capturedTokenRange) {
 | 
			
		||||
            // We will assign capturedTokenRange.startIndex to be the index of the next token to be appended
 | 
			
		||||
            excerptStartIndex = excerptTokens.length;
 | 
			
		||||
        }
 | 
			
		||||
        if (span.prefix) {
 | 
			
		||||
            let canonicalReference = undefined;
 | 
			
		||||
            if (span.kind === ts.SyntaxKind.Identifier) {
 | 
			
		||||
                const name = span.node;
 | 
			
		||||
                if (!ExcerptBuilder._isDeclarationName(name)) {
 | 
			
		||||
                    canonicalReference = state.referenceGenerator.getDeclarationReferenceForIdentifier(name);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (canonicalReference) {
 | 
			
		||||
                ExcerptBuilder._appendToken(excerptTokens, api_extractor_model_1.ExcerptTokenKind.Reference, span.prefix, canonicalReference);
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                ExcerptBuilder._appendToken(excerptTokens, api_extractor_model_1.ExcerptTokenKind.Content, span.prefix);
 | 
			
		||||
            }
 | 
			
		||||
            state.lastAppendedTokenIsSeparator = false;
 | 
			
		||||
        }
 | 
			
		||||
        for (const child of span.children) {
 | 
			
		||||
            if (span.node === state.startingNode) {
 | 
			
		||||
                if (state.stopBeforeChildKind && child.kind === state.stopBeforeChildKind) {
 | 
			
		||||
                    // We reached a child whose kind is stopBeforeChildKind, so stop traversing
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            if (!this._buildSpan(excerptTokens, child, state)) {
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (span.suffix) {
 | 
			
		||||
            ExcerptBuilder._appendToken(excerptTokens, api_extractor_model_1.ExcerptTokenKind.Content, span.suffix);
 | 
			
		||||
            state.lastAppendedTokenIsSeparator = false;
 | 
			
		||||
        }
 | 
			
		||||
        if (span.separator) {
 | 
			
		||||
            ExcerptBuilder._appendToken(excerptTokens, api_extractor_model_1.ExcerptTokenKind.Content, span.separator);
 | 
			
		||||
            state.lastAppendedTokenIsSeparator = true;
 | 
			
		||||
        }
 | 
			
		||||
        // Are we building a excerpt?  If so, set its range
 | 
			
		||||
        if (capturedTokenRange) {
 | 
			
		||||
            capturedTokenRange.startIndex = excerptStartIndex;
 | 
			
		||||
            // We will assign capturedTokenRange.startIndex to be the index after the last token
 | 
			
		||||
            // that was appended so far. However, if the last appended token was a separator, omit
 | 
			
		||||
            // it from the range.
 | 
			
		||||
            let excerptEndIndex = excerptTokens.length;
 | 
			
		||||
            if (state.lastAppendedTokenIsSeparator) {
 | 
			
		||||
                excerptEndIndex--;
 | 
			
		||||
            }
 | 
			
		||||
            capturedTokenRange.endIndex = excerptEndIndex;
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
    static _appendToken(excerptTokens, excerptTokenKind, text, canonicalReference) {
 | 
			
		||||
        if (text.length === 0) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        const excerptToken = { kind: excerptTokenKind, text: text };
 | 
			
		||||
        if (canonicalReference !== undefined) {
 | 
			
		||||
            excerptToken.canonicalReference = canonicalReference.toString();
 | 
			
		||||
        }
 | 
			
		||||
        excerptTokens.push(excerptToken);
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Condenses the provided excerpt tokens by merging tokens where possible. Updates the provided token ranges to
 | 
			
		||||
     * remain accurate after token merging.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * For example, suppose we have excerpt tokens ["A", "B", "C"] and a token range [0, 2]. If the excerpt tokens
 | 
			
		||||
     * are condensed to ["AB", "C"], then the token range would be updated to [0, 1]. Note that merges are only
 | 
			
		||||
     * performed if they are compatible with the provided token ranges. In the example above, if our token range was
 | 
			
		||||
     * originally [0, 1], we would not be able to merge tokens "A" and "B".
 | 
			
		||||
     */
 | 
			
		||||
    static _condenseTokens(excerptTokens, tokenRanges) {
 | 
			
		||||
        // This set is used to quickly lookup a start or end index.
 | 
			
		||||
        const startOrEndIndices = new Set();
 | 
			
		||||
        for (const tokenRange of tokenRanges) {
 | 
			
		||||
            startOrEndIndices.add(tokenRange.startIndex);
 | 
			
		||||
            startOrEndIndices.add(tokenRange.endIndex);
 | 
			
		||||
        }
 | 
			
		||||
        for (let currentIndex = 1; currentIndex < excerptTokens.length; ++currentIndex) {
 | 
			
		||||
            while (currentIndex < excerptTokens.length) {
 | 
			
		||||
                const prevPrevToken = excerptTokens[currentIndex - 2]; // May be undefined
 | 
			
		||||
                const prevToken = excerptTokens[currentIndex - 1];
 | 
			
		||||
                const currentToken = excerptTokens[currentIndex];
 | 
			
		||||
                // The number of excerpt tokens that are merged in this iteration. We need this to determine
 | 
			
		||||
                // how to update the start and end indices of our token ranges.
 | 
			
		||||
                let mergeCount;
 | 
			
		||||
                // There are two types of merges that can occur. We only perform these merges if they are
 | 
			
		||||
                // compatible with all of our token ranges.
 | 
			
		||||
                if (prevPrevToken &&
 | 
			
		||||
                    prevPrevToken.kind === api_extractor_model_1.ExcerptTokenKind.Reference &&
 | 
			
		||||
                    prevToken.kind === api_extractor_model_1.ExcerptTokenKind.Content &&
 | 
			
		||||
                    prevToken.text.trim() === '.' &&
 | 
			
		||||
                    currentToken.kind === api_extractor_model_1.ExcerptTokenKind.Reference &&
 | 
			
		||||
                    !startOrEndIndices.has(currentIndex) &&
 | 
			
		||||
                    !startOrEndIndices.has(currentIndex - 1)) {
 | 
			
		||||
                    // If the current token is a reference token, the previous token is a ".", and the previous-
 | 
			
		||||
                    // previous token is a reference token, then merge all three tokens into a reference token.
 | 
			
		||||
                    //
 | 
			
		||||
                    // For example: Given ["MyNamespace" (R), ".", "MyClass" (R)], tokens "." and "MyClass" might
 | 
			
		||||
                    // be merged into "MyNamespace". The condensed token would be ["MyNamespace.MyClass" (R)].
 | 
			
		||||
                    prevPrevToken.text += prevToken.text + currentToken.text;
 | 
			
		||||
                    prevPrevToken.canonicalReference = currentToken.canonicalReference;
 | 
			
		||||
                    mergeCount = 2;
 | 
			
		||||
                    currentIndex--;
 | 
			
		||||
                }
 | 
			
		||||
                else if (
 | 
			
		||||
                // If the current and previous tokens are both content tokens, then merge the tokens into a
 | 
			
		||||
                // single content token. For example: Given ["export ", "declare class"], these tokens
 | 
			
		||||
                // might be merged into "export declare class".
 | 
			
		||||
                prevToken.kind === api_extractor_model_1.ExcerptTokenKind.Content &&
 | 
			
		||||
                    prevToken.kind === currentToken.kind &&
 | 
			
		||||
                    !startOrEndIndices.has(currentIndex)) {
 | 
			
		||||
                    prevToken.text += currentToken.text;
 | 
			
		||||
                    mergeCount = 1;
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    // Otherwise, no merging can occur here. Continue to the next index.
 | 
			
		||||
                    break;
 | 
			
		||||
                }
 | 
			
		||||
                // Remove the now redundant excerpt token(s), as they were merged into a previous token.
 | 
			
		||||
                excerptTokens.splice(currentIndex, mergeCount);
 | 
			
		||||
                // Update the start and end indices for all token ranges based upon how many excerpt
 | 
			
		||||
                // tokens were merged and in what positions.
 | 
			
		||||
                for (const tokenRange of tokenRanges) {
 | 
			
		||||
                    if (tokenRange.startIndex > currentIndex) {
 | 
			
		||||
                        tokenRange.startIndex -= mergeCount;
 | 
			
		||||
                    }
 | 
			
		||||
                    if (tokenRange.endIndex > currentIndex) {
 | 
			
		||||
                        tokenRange.endIndex -= mergeCount;
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                // Clear and repopulate our set with the updated indices.
 | 
			
		||||
                startOrEndIndices.clear();
 | 
			
		||||
                for (const tokenRange of tokenRanges) {
 | 
			
		||||
                    startOrEndIndices.add(tokenRange.startIndex);
 | 
			
		||||
                    startOrEndIndices.add(tokenRange.endIndex);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    static _isDeclarationName(name) {
 | 
			
		||||
        return ExcerptBuilder._isDeclaration(name.parent) && name.parent.name === name;
 | 
			
		||||
    }
 | 
			
		||||
    static _isDeclaration(node) {
 | 
			
		||||
        switch (node.kind) {
 | 
			
		||||
            case ts.SyntaxKind.FunctionDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.FunctionExpression:
 | 
			
		||||
            case ts.SyntaxKind.VariableDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.Parameter:
 | 
			
		||||
            case ts.SyntaxKind.EnumDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.ClassDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.ClassExpression:
 | 
			
		||||
            case ts.SyntaxKind.ModuleDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.MethodDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.MethodSignature:
 | 
			
		||||
            case ts.SyntaxKind.PropertyDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.PropertySignature:
 | 
			
		||||
            case ts.SyntaxKind.GetAccessor:
 | 
			
		||||
            case ts.SyntaxKind.SetAccessor:
 | 
			
		||||
            case ts.SyntaxKind.InterfaceDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.TypeAliasDeclaration:
 | 
			
		||||
            case ts.SyntaxKind.TypeParameter:
 | 
			
		||||
            case ts.SyntaxKind.EnumMember:
 | 
			
		||||
            case ts.SyntaxKind.BindingElement:
 | 
			
		||||
                return true;
 | 
			
		||||
            default:
 | 
			
		||||
                return false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.ExcerptBuilder = ExcerptBuilder;
 | 
			
		||||
//# sourceMappingURL=ExcerptBuilder.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/ExcerptBuilder.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										136
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,136 @@
 | 
			
		||||
import { type IStringBuilder } from '@rushstack/node-core-library';
 | 
			
		||||
/**
 | 
			
		||||
 * A utility for writing indented text.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 *
 | 
			
		||||
 * Note that the indentation is inserted at the last possible opportunity.
 | 
			
		||||
 * For example, this code...
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 *   writer.write('begin\n');
 | 
			
		||||
 *   writer.increaseIndent();
 | 
			
		||||
 *   writer.write('one\ntwo\n');
 | 
			
		||||
 *   writer.decreaseIndent();
 | 
			
		||||
 *   writer.increaseIndent();
 | 
			
		||||
 *   writer.decreaseIndent();
 | 
			
		||||
 *   writer.write('end');
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * ...would produce this output:
 | 
			
		||||
 *
 | 
			
		||||
 * ```
 | 
			
		||||
 *   begin
 | 
			
		||||
 *     one
 | 
			
		||||
 *     two
 | 
			
		||||
 *   end
 | 
			
		||||
 * ```
 | 
			
		||||
 */
 | 
			
		||||
export declare class IndentedWriter {
 | 
			
		||||
    /**
 | 
			
		||||
     * The text characters used to create one level of indentation.
 | 
			
		||||
     * Two spaces by default.
 | 
			
		||||
     */
 | 
			
		||||
    defaultIndentPrefix: string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Whether to indent blank lines
 | 
			
		||||
     */
 | 
			
		||||
    indentBlankLines: boolean;
 | 
			
		||||
    /**
 | 
			
		||||
     * Trims leading spaces from the input text before applying the indent.
 | 
			
		||||
     *
 | 
			
		||||
     * @remarks
 | 
			
		||||
     * Consider the following example:
 | 
			
		||||
     *
 | 
			
		||||
     * ```ts
 | 
			
		||||
     * indentedWriter.increaseIndent('    '); // four spaces
 | 
			
		||||
     * indentedWriter.write('  a\n  b  c\n');
 | 
			
		||||
     * indentedWriter.decreaseIndent();
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * Normally the output would be indented by 6 spaces: 4 from `increaseIndent()`, plus the 2 spaces
 | 
			
		||||
     * from `write()`:
 | 
			
		||||
     * ```
 | 
			
		||||
     *       a
 | 
			
		||||
     *       b  c
 | 
			
		||||
     * ```
 | 
			
		||||
     *
 | 
			
		||||
     * Setting `trimLeadingSpaces=true` will trim the leading spaces, so that the lines are indented
 | 
			
		||||
     * by 4 spaces only:
 | 
			
		||||
     * ```
 | 
			
		||||
     *     a
 | 
			
		||||
     *     b  c
 | 
			
		||||
     * ```
 | 
			
		||||
     */
 | 
			
		||||
    trimLeadingSpaces: boolean;
 | 
			
		||||
    private readonly _builder;
 | 
			
		||||
    private _latestChunk;
 | 
			
		||||
    private _previousChunk;
 | 
			
		||||
    private _atStartOfLine;
 | 
			
		||||
    private readonly _indentStack;
 | 
			
		||||
    private _indentText;
 | 
			
		||||
    private _previousLineIsBlank;
 | 
			
		||||
    private _currentLineIsBlank;
 | 
			
		||||
    constructor(builder?: IStringBuilder);
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the output that was built so far.
 | 
			
		||||
     */
 | 
			
		||||
    getText(): string;
 | 
			
		||||
    toString(): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Increases the indentation.  Normally the indentation is two spaces,
 | 
			
		||||
     * however an arbitrary prefix can optional be specified.  (For example,
 | 
			
		||||
     * the prefix could be "// " to indent and comment simultaneously.)
 | 
			
		||||
     * Each call to IndentedWriter.increaseIndent() must be followed by a
 | 
			
		||||
     * corresponding call to IndentedWriter.decreaseIndent().
 | 
			
		||||
     */
 | 
			
		||||
    increaseIndent(indentPrefix?: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Decreases the indentation, reverting the effect of the corresponding call
 | 
			
		||||
     * to IndentedWriter.increaseIndent().
 | 
			
		||||
     */
 | 
			
		||||
    decreaseIndent(): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * A shorthand for ensuring that increaseIndent()/decreaseIndent() occur
 | 
			
		||||
     * in pairs.
 | 
			
		||||
     */
 | 
			
		||||
    indentScope(scope: () => void, indentPrefix?: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds a newline if the file pointer is not already at the start of the line (or start of the stream).
 | 
			
		||||
     */
 | 
			
		||||
    ensureNewLine(): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds up to two newlines to ensure that there is a blank line above the current position.
 | 
			
		||||
     * The start of the stream is considered to be a blank line, so `ensureSkippedLine()` has no effect
 | 
			
		||||
     * unless some text has been written.
 | 
			
		||||
     */
 | 
			
		||||
    ensureSkippedLine(): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the last character that was written, or an empty string if no characters have been written yet.
 | 
			
		||||
     */
 | 
			
		||||
    peekLastCharacter(): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the second to last character that was written, or an empty string if less than one characters
 | 
			
		||||
     * have been written yet.
 | 
			
		||||
     */
 | 
			
		||||
    peekSecondLastCharacter(): string;
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes some text to the internal string buffer, applying indentation according
 | 
			
		||||
     * to the current indentation level.  If the string contains multiple newlines,
 | 
			
		||||
     * each line will be indented separately.
 | 
			
		||||
     */
 | 
			
		||||
    write(message: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * A shorthand for writing an optional message, followed by a newline.
 | 
			
		||||
     * Indentation is applied following the semantics of IndentedWriter.write().
 | 
			
		||||
     */
 | 
			
		||||
    writeLine(message?: string): void;
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes a string that does not contain any newline characters.
 | 
			
		||||
     */
 | 
			
		||||
    private _writeLinePart;
 | 
			
		||||
    private _writeNewLine;
 | 
			
		||||
    private _write;
 | 
			
		||||
    private _updateIndentText;
 | 
			
		||||
}
 | 
			
		||||
//# sourceMappingURL=IndentedWriter.d.ts.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.d.ts.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
{"version":3,"file":"IndentedWriter.d.ts","sourceRoot":"","sources":["../../src/generators/IndentedWriter.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAElF;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAc;IACzB;;;OAGG;IACI,mBAAmB,EAAE,MAAM,CAAU;IAE5C;;OAEG;IACI,gBAAgB,EAAE,OAAO,CAAS;IAEzC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACI,iBAAiB,EAAE,OAAO,CAAS;IAE1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiB;IAE1C,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,cAAc,CAAU;IAEhC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IACxC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,oBAAoB,CAAU;IACtC,OAAO,CAAC,mBAAmB,CAAU;gBAElB,OAAO,CAAC,EAAE,cAAc;IAY3C;;OAEG;IACI,OAAO,IAAI,MAAM;IAIjB,QAAQ,IAAI,MAAM;IAIzB;;;;;;OAMG;IACI,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAKlD;;;OAGG;IACI,cAAc,IAAI,IAAI;IAK7B;;;OAGG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,IAAI,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAMlE;;OAEG;IACI,aAAa,IAAI,IAAI;IAO5B;;;;OAIG;IACI,iBAAiB,IAAI,IAAI;IAOhC;;OAEG;IACI,iBAAiB,IAAI,MAAM;IAOlC;;;OAGG;IACI,uBAAuB,IAAI,MAAM;IAYxC;;;;OAIG;IACI,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAyBnC;;;OAGG;IACI,SAAS,CAAC,OAAO,GAAE,MAAW,GAAG,IAAI;IAO5C;;OAEG;IACH,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,iBAAiB;CAG1B"}
 | 
			
		||||
							
								
								
									
										242
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,242 @@
 | 
			
		||||
"use strict";
 | 
			
		||||
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
 | 
			
		||||
// See LICENSE in the project root for license information.
 | 
			
		||||
Object.defineProperty(exports, "__esModule", { value: true });
 | 
			
		||||
exports.IndentedWriter = void 0;
 | 
			
		||||
const node_core_library_1 = require("@rushstack/node-core-library");
 | 
			
		||||
/**
 | 
			
		||||
 * A utility for writing indented text.
 | 
			
		||||
 *
 | 
			
		||||
 * @remarks
 | 
			
		||||
 *
 | 
			
		||||
 * Note that the indentation is inserted at the last possible opportunity.
 | 
			
		||||
 * For example, this code...
 | 
			
		||||
 *
 | 
			
		||||
 * ```ts
 | 
			
		||||
 *   writer.write('begin\n');
 | 
			
		||||
 *   writer.increaseIndent();
 | 
			
		||||
 *   writer.write('one\ntwo\n');
 | 
			
		||||
 *   writer.decreaseIndent();
 | 
			
		||||
 *   writer.increaseIndent();
 | 
			
		||||
 *   writer.decreaseIndent();
 | 
			
		||||
 *   writer.write('end');
 | 
			
		||||
 * ```
 | 
			
		||||
 *
 | 
			
		||||
 * ...would produce this output:
 | 
			
		||||
 *
 | 
			
		||||
 * ```
 | 
			
		||||
 *   begin
 | 
			
		||||
 *     one
 | 
			
		||||
 *     two
 | 
			
		||||
 *   end
 | 
			
		||||
 * ```
 | 
			
		||||
 */
 | 
			
		||||
class IndentedWriter {
 | 
			
		||||
    constructor(builder) {
 | 
			
		||||
        /**
 | 
			
		||||
         * The text characters used to create one level of indentation.
 | 
			
		||||
         * Two spaces by default.
 | 
			
		||||
         */
 | 
			
		||||
        this.defaultIndentPrefix = '    ';
 | 
			
		||||
        /**
 | 
			
		||||
         * Whether to indent blank lines
 | 
			
		||||
         */
 | 
			
		||||
        this.indentBlankLines = false;
 | 
			
		||||
        /**
 | 
			
		||||
         * Trims leading spaces from the input text before applying the indent.
 | 
			
		||||
         *
 | 
			
		||||
         * @remarks
 | 
			
		||||
         * Consider the following example:
 | 
			
		||||
         *
 | 
			
		||||
         * ```ts
 | 
			
		||||
         * indentedWriter.increaseIndent('    '); // four spaces
 | 
			
		||||
         * indentedWriter.write('  a\n  b  c\n');
 | 
			
		||||
         * indentedWriter.decreaseIndent();
 | 
			
		||||
         * ```
 | 
			
		||||
         *
 | 
			
		||||
         * Normally the output would be indented by 6 spaces: 4 from `increaseIndent()`, plus the 2 spaces
 | 
			
		||||
         * from `write()`:
 | 
			
		||||
         * ```
 | 
			
		||||
         *       a
 | 
			
		||||
         *       b  c
 | 
			
		||||
         * ```
 | 
			
		||||
         *
 | 
			
		||||
         * Setting `trimLeadingSpaces=true` will trim the leading spaces, so that the lines are indented
 | 
			
		||||
         * by 4 spaces only:
 | 
			
		||||
         * ```
 | 
			
		||||
         *     a
 | 
			
		||||
         *     b  c
 | 
			
		||||
         * ```
 | 
			
		||||
         */
 | 
			
		||||
        this.trimLeadingSpaces = false;
 | 
			
		||||
        this._builder = builder === undefined ? new node_core_library_1.StringBuilder() : builder;
 | 
			
		||||
        this._latestChunk = undefined;
 | 
			
		||||
        this._previousChunk = undefined;
 | 
			
		||||
        this._atStartOfLine = true;
 | 
			
		||||
        this._previousLineIsBlank = true;
 | 
			
		||||
        this._currentLineIsBlank = true;
 | 
			
		||||
        this._indentStack = [];
 | 
			
		||||
        this._indentText = '';
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Retrieves the output that was built so far.
 | 
			
		||||
     */
 | 
			
		||||
    getText() {
 | 
			
		||||
        return this._builder.toString();
 | 
			
		||||
    }
 | 
			
		||||
    toString() {
 | 
			
		||||
        return this.getText();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Increases the indentation.  Normally the indentation is two spaces,
 | 
			
		||||
     * however an arbitrary prefix can optional be specified.  (For example,
 | 
			
		||||
     * the prefix could be "// " to indent and comment simultaneously.)
 | 
			
		||||
     * Each call to IndentedWriter.increaseIndent() must be followed by a
 | 
			
		||||
     * corresponding call to IndentedWriter.decreaseIndent().
 | 
			
		||||
     */
 | 
			
		||||
    increaseIndent(indentPrefix) {
 | 
			
		||||
        this._indentStack.push(indentPrefix !== undefined ? indentPrefix : this.defaultIndentPrefix);
 | 
			
		||||
        this._updateIndentText();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Decreases the indentation, reverting the effect of the corresponding call
 | 
			
		||||
     * to IndentedWriter.increaseIndent().
 | 
			
		||||
     */
 | 
			
		||||
    decreaseIndent() {
 | 
			
		||||
        this._indentStack.pop();
 | 
			
		||||
        this._updateIndentText();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * A shorthand for ensuring that increaseIndent()/decreaseIndent() occur
 | 
			
		||||
     * in pairs.
 | 
			
		||||
     */
 | 
			
		||||
    indentScope(scope, indentPrefix) {
 | 
			
		||||
        this.increaseIndent(indentPrefix);
 | 
			
		||||
        scope();
 | 
			
		||||
        this.decreaseIndent();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds a newline if the file pointer is not already at the start of the line (or start of the stream).
 | 
			
		||||
     */
 | 
			
		||||
    ensureNewLine() {
 | 
			
		||||
        const lastCharacter = this.peekLastCharacter();
 | 
			
		||||
        if (lastCharacter !== '\n' && lastCharacter !== '') {
 | 
			
		||||
            this._writeNewLine();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Adds up to two newlines to ensure that there is a blank line above the current position.
 | 
			
		||||
     * The start of the stream is considered to be a blank line, so `ensureSkippedLine()` has no effect
 | 
			
		||||
     * unless some text has been written.
 | 
			
		||||
     */
 | 
			
		||||
    ensureSkippedLine() {
 | 
			
		||||
        this.ensureNewLine();
 | 
			
		||||
        if (!this._previousLineIsBlank) {
 | 
			
		||||
            this._writeNewLine();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the last character that was written, or an empty string if no characters have been written yet.
 | 
			
		||||
     */
 | 
			
		||||
    peekLastCharacter() {
 | 
			
		||||
        if (this._latestChunk !== undefined) {
 | 
			
		||||
            return this._latestChunk.substr(-1, 1);
 | 
			
		||||
        }
 | 
			
		||||
        return '';
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Returns the second to last character that was written, or an empty string if less than one characters
 | 
			
		||||
     * have been written yet.
 | 
			
		||||
     */
 | 
			
		||||
    peekSecondLastCharacter() {
 | 
			
		||||
        if (this._latestChunk !== undefined) {
 | 
			
		||||
            if (this._latestChunk.length > 1) {
 | 
			
		||||
                return this._latestChunk.substr(-2, 1);
 | 
			
		||||
            }
 | 
			
		||||
            if (this._previousChunk !== undefined) {
 | 
			
		||||
                return this._previousChunk.substr(-1, 1);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return '';
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes some text to the internal string buffer, applying indentation according
 | 
			
		||||
     * to the current indentation level.  If the string contains multiple newlines,
 | 
			
		||||
     * each line will be indented separately.
 | 
			
		||||
     */
 | 
			
		||||
    write(message) {
 | 
			
		||||
        if (message.length === 0) {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        // If there are no newline characters, then append the string verbatim
 | 
			
		||||
        if (!/[\r\n]/.test(message)) {
 | 
			
		||||
            this._writeLinePart(message);
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        // Otherwise split the lines and write each one individually
 | 
			
		||||
        let first = true;
 | 
			
		||||
        for (const linePart of message.split('\n')) {
 | 
			
		||||
            if (!first) {
 | 
			
		||||
                this._writeNewLine();
 | 
			
		||||
            }
 | 
			
		||||
            else {
 | 
			
		||||
                first = false;
 | 
			
		||||
            }
 | 
			
		||||
            if (linePart) {
 | 
			
		||||
                this._writeLinePart(linePart.replace(/[\r]/g, ''));
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * A shorthand for writing an optional message, followed by a newline.
 | 
			
		||||
     * Indentation is applied following the semantics of IndentedWriter.write().
 | 
			
		||||
     */
 | 
			
		||||
    writeLine(message = '') {
 | 
			
		||||
        if (message.length > 0) {
 | 
			
		||||
            this.write(message);
 | 
			
		||||
        }
 | 
			
		||||
        this._writeNewLine();
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
     * Writes a string that does not contain any newline characters.
 | 
			
		||||
     */
 | 
			
		||||
    _writeLinePart(message) {
 | 
			
		||||
        let trimmedMessage = message;
 | 
			
		||||
        if (this.trimLeadingSpaces && this._atStartOfLine) {
 | 
			
		||||
            trimmedMessage = message.replace(/^ +/, '');
 | 
			
		||||
        }
 | 
			
		||||
        if (trimmedMessage.length > 0) {
 | 
			
		||||
            if (this._atStartOfLine && this._indentText.length > 0) {
 | 
			
		||||
                this._write(this._indentText);
 | 
			
		||||
            }
 | 
			
		||||
            this._write(trimmedMessage);
 | 
			
		||||
            if (this._currentLineIsBlank) {
 | 
			
		||||
                if (/\S/.test(trimmedMessage)) {
 | 
			
		||||
                    this._currentLineIsBlank = false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            this._atStartOfLine = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    _writeNewLine() {
 | 
			
		||||
        if (this.indentBlankLines) {
 | 
			
		||||
            if (this._atStartOfLine && this._indentText.length > 0) {
 | 
			
		||||
                this._write(this._indentText);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        this._previousLineIsBlank = this._currentLineIsBlank;
 | 
			
		||||
        this._write('\n');
 | 
			
		||||
        this._currentLineIsBlank = true;
 | 
			
		||||
        this._atStartOfLine = true;
 | 
			
		||||
    }
 | 
			
		||||
    _write(s) {
 | 
			
		||||
        this._previousChunk = this._latestChunk;
 | 
			
		||||
        this._latestChunk = s;
 | 
			
		||||
        this._builder.append(s);
 | 
			
		||||
    }
 | 
			
		||||
    _updateIndentText() {
 | 
			
		||||
        this._indentText = this._indentStack.join('');
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
exports.IndentedWriter = IndentedWriter;
 | 
			
		||||
//# sourceMappingURL=IndentedWriter.js.map
 | 
			
		||||
							
								
								
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								node_modules/@microsoft/api-extractor/lib/generators/IndentedWriter.js.map
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user