@microsoft/api-extractor 7.34.8 → 7.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@
5
5
  "toolPackages": [
6
6
  {
7
7
  "packageName": "@microsoft/api-extractor",
8
- "packageVersion": "7.34.0"
8
+ "packageVersion": "7.34.8"
9
9
  }
10
10
  ]
11
11
  }
@@ -159,6 +159,6 @@ class PackageMetadataManager {
159
159
  return packageMetadata.aedocSupported;
160
160
  }
161
161
  }
162
- exports.PackageMetadataManager = PackageMetadataManager;
163
162
  PackageMetadataManager.tsdocMetadataFilename = 'tsdoc-metadata.json';
163
+ exports.PackageMetadataManager = PackageMetadataManager;
164
164
  //# sourceMappingURL=PackageMetadataManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PackageMetadataManager.js","sourceRoot":"","sources":["../../src/analyzer/PackageMetadataManager.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\n\nimport {\n PackageJsonLookup,\n FileSystem,\n JsonFile,\n NewlineKind,\n INodePackageJson,\n JsonObject\n} from '@rushstack/node-core-library';\nimport { Extractor } from '../api/Extractor';\nimport { MessageRouter } from '../collector/MessageRouter';\nimport { ConsoleMessageId } from '../api/ConsoleMessageId';\n\n/**\n * Represents analyzed information for a package.json file.\n * This object is constructed and returned by PackageMetadataManager.\n */\nexport class PackageMetadata {\n /**\n * The absolute path to the package.json file being analyzed.\n */\n public readonly packageJsonPath: string;\n /**\n * The parsed contents of package.json. Note that PackageJsonLookup\n * only includes essential fields.\n */\n public readonly packageJson: INodePackageJson;\n /**\n * If true, then the package's documentation comments can be assumed\n * to contain API Extractor compatible TSDoc tags.\n */\n public readonly aedocSupported: boolean;\n\n public constructor(packageJsonPath: string, packageJson: INodePackageJson, aedocSupported: boolean) {\n this.packageJsonPath = packageJsonPath;\n this.packageJson = packageJson;\n this.aedocSupported = aedocSupported;\n }\n}\n\n/**\n * This class maintains a cache of analyzed information obtained from package.json\n * files. It is built on top of the PackageJsonLookup class.\n *\n * @remarks\n *\n * IMPORTANT: Don't use PackageMetadataManager to analyze source files from the current project:\n * 1. Files such as tsdoc-metadata.json may not have been built yet, and thus may contain incorrect information.\n * 2. The current project is not guaranteed to have a package.json file at all. For example, API Extractor can\n * be invoked on a bare .d.ts file.\n *\n * Use ts.program.isSourceFileFromExternalLibrary() to test source files before passing the to PackageMetadataManager.\n */\nexport class PackageMetadataManager {\n public static tsdocMetadataFilename: string = 'tsdoc-metadata.json';\n\n private readonly _packageJsonLookup: PackageJsonLookup;\n private readonly _messageRouter: MessageRouter;\n private readonly _packageMetadataByPackageJsonPath: Map<string, PackageMetadata> = new Map<\n string,\n PackageMetadata\n >();\n\n public constructor(packageJsonLookup: PackageJsonLookup, messageRouter: MessageRouter) {\n this._packageJsonLookup = packageJsonLookup;\n this._messageRouter = messageRouter;\n }\n\n // This feature is still being standardized: https://github.com/microsoft/tsdoc/issues/7\n // In the future we will use the @microsoft/tsdoc library to read this file.\n private static _resolveTsdocMetadataPathFromPackageJson(\n packageFolder: string,\n packageJson: INodePackageJson\n ): string {\n const tsdocMetadataFilename: string = PackageMetadataManager.tsdocMetadataFilename;\n\n let tsdocMetadataRelativePath: string;\n\n if (packageJson.tsdocMetadata) {\n // 1. If package.json contains a field such as \"tsdocMetadata\": \"./path1/path2/tsdoc-metadata.json\",\n // then that takes precedence. This convention will be rarely needed, since the other rules below generally\n // produce a good result.\n tsdocMetadataRelativePath = packageJson.tsdocMetadata;\n } else if (packageJson.typings) {\n // 2. If package.json contains a field such as \"typings\": \"./path1/path2/index.d.ts\", then we look\n // for the file under \"./path1/path2/tsdoc-metadata.json\"\n tsdocMetadataRelativePath = path.join(path.dirname(packageJson.typings), tsdocMetadataFilename);\n } else if (packageJson.main) {\n // 3. If package.json contains a field such as \"main\": \"./path1/path2/index.js\", then we look for\n // the file under \"./path1/path2/tsdoc-metadata.json\"\n tsdocMetadataRelativePath = path.join(path.dirname(packageJson.main), tsdocMetadataFilename);\n } else {\n // 4. If none of the above rules apply, then by default we look for the file under \"./tsdoc-metadata.json\"\n // since the default entry point is \"./index.js\"\n tsdocMetadataRelativePath = tsdocMetadataFilename;\n }\n\n // Always resolve relative to the package folder.\n const tsdocMetadataPath: string = path.resolve(packageFolder, tsdocMetadataRelativePath);\n return tsdocMetadataPath;\n }\n\n /**\n * @param tsdocMetadataPath - An explicit path that can be configured in api-extractor.json.\n * If this parameter is not an empty string, it overrides the normal path calculation.\n * @returns the absolute path to the TSDoc metadata file\n */\n public static resolveTsdocMetadataPath(\n packageFolder: string,\n packageJson: INodePackageJson,\n tsdocMetadataPath?: string\n ): string {\n if (tsdocMetadataPath) {\n return path.resolve(packageFolder, tsdocMetadataPath);\n }\n return PackageMetadataManager._resolveTsdocMetadataPathFromPackageJson(packageFolder, packageJson);\n }\n\n /**\n * Writes the TSDoc metadata file to the specified output file.\n */\n public static writeTsdocMetadataFile(tsdocMetadataPath: string, newlineKind: NewlineKind): void {\n const fileObject: JsonObject = {\n tsdocVersion: '0.12',\n toolPackages: [\n {\n packageName: '@microsoft/api-extractor',\n packageVersion: Extractor.version\n }\n ]\n };\n\n const fileContent: string =\n '// This file is read by tools that parse documentation comments conforming to the TSDoc standard.\\n' +\n '// It should be published with your NPM package. It should not be tracked by Git.\\n' +\n JsonFile.stringify(fileObject);\n\n FileSystem.writeFile(tsdocMetadataPath, fileContent, {\n convertLineEndings: newlineKind,\n ensureFolderExists: true\n });\n }\n\n /**\n * Finds the package.json in a parent folder of the specified source file, and\n * returns a PackageMetadata object. If no package.json was found, then undefined\n * is returned. The results are cached.\n */\n public tryFetchPackageMetadata(sourceFilePath: string): PackageMetadata | undefined {\n const packageJsonFilePath: string | undefined =\n this._packageJsonLookup.tryGetPackageJsonFilePathFor(sourceFilePath);\n if (!packageJsonFilePath) {\n return undefined;\n }\n let packageMetadata: PackageMetadata | undefined =\n this._packageMetadataByPackageJsonPath.get(packageJsonFilePath);\n\n if (!packageMetadata) {\n const packageJson: INodePackageJson = this._packageJsonLookup.loadNodePackageJson(packageJsonFilePath);\n\n const packageJsonFolder: string = path.dirname(packageJsonFilePath);\n\n let aedocSupported: boolean = false;\n\n const tsdocMetadataPath: string = PackageMetadataManager._resolveTsdocMetadataPathFromPackageJson(\n packageJsonFolder,\n packageJson\n );\n\n if (FileSystem.exists(tsdocMetadataPath)) {\n this._messageRouter.logVerbose(\n ConsoleMessageId.FoundTSDocMetadata,\n 'Found metadata in ' + tsdocMetadataPath\n );\n // If the file exists at all, assume it was written by API Extractor\n aedocSupported = true;\n }\n\n packageMetadata = new PackageMetadata(packageJsonFilePath, packageJson, aedocSupported);\n this._packageMetadataByPackageJsonPath.set(packageJsonFilePath, packageMetadata);\n }\n\n return packageMetadata;\n }\n\n /**\n * Returns true if the source file is part of a package whose .d.ts files support AEDoc annotations.\n */\n public isAedocSupportedFor(sourceFilePath: string): boolean {\n const packageMetadata: PackageMetadata | undefined = this.tryFetchPackageMetadata(sourceFilePath);\n if (!packageMetadata) {\n return false;\n }\n return packageMetadata.aedocSupported;\n }\n}\n"]}
1
+ {"version":3,"file":"PackageMetadataManager.js","sourceRoot":"","sources":["../../src/analyzer/PackageMetadataManager.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3D,2CAA6B;AAE7B,oEAOsC;AACtC,gDAA6C;AAI7C;;;GAGG;AACH,MAAa,eAAe;IAgB1B,YAAmB,eAAuB,EAAE,WAA6B,EAAE,cAAuB;QAChG,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;CACF;AArBD,0CAqBC;AAED;;;;;;;;;;;;GAYG;AACH,MAAa,sBAAsB;IAUjC,YAAmB,iBAAoC,EAAE,aAA4B;QALpE,sCAAiC,GAAiC,IAAI,GAAG,EAGvF,CAAC;QAGF,IAAI,CAAC,kBAAkB,GAAG,iBAAiB,CAAC;QAC5C,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAED,wFAAwF;IACxF,4EAA4E;IACpE,MAAM,CAAC,wCAAwC,CACrD,aAAqB,EACrB,WAA6B;QAE7B,MAAM,qBAAqB,GAAW,sBAAsB,CAAC,qBAAqB,CAAC;QAEnF,IAAI,yBAAiC,CAAC;QAEtC,IAAI,WAAW,CAAC,aAAa,EAAE;YAC7B,oGAAoG;YACpG,4GAA4G;YAC5G,yBAAyB;YACzB,yBAAyB,GAAG,WAAW,CAAC,aAAa,CAAC;SACvD;aAAM,IAAI,WAAW,CAAC,OAAO,EAAE;YAC9B,kGAAkG;YAClG,yDAAyD;YACzD,yBAAyB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC,CAAC;SACjG;aAAM,IAAI,WAAW,CAAC,IAAI,EAAE;YAC3B,iGAAiG;YACjG,qDAAqD;YACrD,yBAAyB,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,qBAAqB,CAAC,CAAC;SAC9F;aAAM;YACL,0GAA0G;YAC1G,gDAAgD;YAChD,yBAAyB,GAAG,qBAAqB,CAAC;SACnD;QAED,iDAAiD;QACjD,MAAM,iBAAiB,GAAW,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAAC;QACzF,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,wBAAwB,CACpC,aAAqB,EACrB,WAA6B,EAC7B,iBAA0B;QAE1B,IAAI,iBAAiB,EAAE;YACrB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;SACvD;QACD,OAAO,sBAAsB,CAAC,wCAAwC,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACrG,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,sBAAsB,CAAC,iBAAyB,EAAE,WAAwB;QACtF,MAAM,UAAU,GAAe;YAC7B,YAAY,EAAE,MAAM;YACpB,YAAY,EAAE;gBACZ;oBACE,WAAW,EAAE,0BAA0B;oBACvC,cAAc,EAAE,qBAAS,CAAC,OAAO;iBAClC;aACF;SACF,CAAC;QAEF,MAAM,WAAW,GACf,qGAAqG;YACrG,sFAAsF;YACtF,4BAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAEjC,8BAAU,CAAC,SAAS,CAAC,iBAAiB,EAAE,WAAW,EAAE;YACnD,kBAAkB,EAAE,WAAW;YAC/B,kBAAkB,EAAE,IAAI;SACzB,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACI,uBAAuB,CAAC,cAAsB;QACnD,MAAM,mBAAmB,GACvB,IAAI,CAAC,kBAAkB,CAAC,4BAA4B,CAAC,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,mBAAmB,EAAE;YACxB,OAAO,SAAS,CAAC;SAClB;QACD,IAAI,eAAe,GACjB,IAAI,CAAC,iCAAiC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAElE,IAAI,CAAC,eAAe,EAAE;YACpB,MAAM,WAAW,GAAqB,IAAI,CAAC,kBAAkB,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;YAEvG,MAAM,iBAAiB,GAAW,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;YAEpE,IAAI,cAAc,GAAY,KAAK,CAAC;YAEpC,MAAM,iBAAiB,GAAW,sBAAsB,CAAC,wCAAwC,CAC/F,iBAAiB,EACjB,WAAW,CACZ,CAAC;YAEF,IAAI,8BAAU,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE;gBACxC,IAAI,CAAC,cAAc,CAAC,UAAU,2EAE5B,oBAAoB,GAAG,iBAAiB,CACzC,CAAC;gBACF,oEAAoE;gBACpE,cAAc,GAAG,IAAI,CAAC;aACvB;YAED,eAAe,GAAG,IAAI,eAAe,CAAC,mBAAmB,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;YACxF,IAAI,CAAC,iCAAiC,CAAC,GAAG,CAAC,mBAAmB,EAAE,eAAe,CAAC,CAAC;SAClF;QAED,OAAO,eAAe,CAAC;IACzB,CAAC;IAED;;OAEG;IACI,mBAAmB,CAAC,cAAsB;QAC/C,MAAM,eAAe,GAAgC,IAAI,CAAC,uBAAuB,CAAC,cAAc,CAAC,CAAC;QAClG,IAAI,CAAC,eAAe,EAAE;YACpB,OAAO,KAAK,CAAC;SACd;QACD,OAAO,eAAe,CAAC,cAAc,CAAC;IACxC,CAAC;;AA5Ia,4CAAqB,GAAW,qBAAqB,AAAhC,CAAiC;AADzD,wDAAsB","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\n\nimport {\n PackageJsonLookup,\n FileSystem,\n JsonFile,\n NewlineKind,\n INodePackageJson,\n JsonObject\n} from '@rushstack/node-core-library';\nimport { Extractor } from '../api/Extractor';\nimport { MessageRouter } from '../collector/MessageRouter';\nimport { ConsoleMessageId } from '../api/ConsoleMessageId';\n\n/**\n * Represents analyzed information for a package.json file.\n * This object is constructed and returned by PackageMetadataManager.\n */\nexport class PackageMetadata {\n /**\n * The absolute path to the package.json file being analyzed.\n */\n public readonly packageJsonPath: string;\n /**\n * The parsed contents of package.json. Note that PackageJsonLookup\n * only includes essential fields.\n */\n public readonly packageJson: INodePackageJson;\n /**\n * If true, then the package's documentation comments can be assumed\n * to contain API Extractor compatible TSDoc tags.\n */\n public readonly aedocSupported: boolean;\n\n public constructor(packageJsonPath: string, packageJson: INodePackageJson, aedocSupported: boolean) {\n this.packageJsonPath = packageJsonPath;\n this.packageJson = packageJson;\n this.aedocSupported = aedocSupported;\n }\n}\n\n/**\n * This class maintains a cache of analyzed information obtained from package.json\n * files. It is built on top of the PackageJsonLookup class.\n *\n * @remarks\n *\n * IMPORTANT: Don't use PackageMetadataManager to analyze source files from the current project:\n * 1. Files such as tsdoc-metadata.json may not have been built yet, and thus may contain incorrect information.\n * 2. The current project is not guaranteed to have a package.json file at all. For example, API Extractor can\n * be invoked on a bare .d.ts file.\n *\n * Use ts.program.isSourceFileFromExternalLibrary() to test source files before passing the to PackageMetadataManager.\n */\nexport class PackageMetadataManager {\n public static tsdocMetadataFilename: string = 'tsdoc-metadata.json';\n\n private readonly _packageJsonLookup: PackageJsonLookup;\n private readonly _messageRouter: MessageRouter;\n private readonly _packageMetadataByPackageJsonPath: Map<string, PackageMetadata> = new Map<\n string,\n PackageMetadata\n >();\n\n public constructor(packageJsonLookup: PackageJsonLookup, messageRouter: MessageRouter) {\n this._packageJsonLookup = packageJsonLookup;\n this._messageRouter = messageRouter;\n }\n\n // This feature is still being standardized: https://github.com/microsoft/tsdoc/issues/7\n // In the future we will use the @microsoft/tsdoc library to read this file.\n private static _resolveTsdocMetadataPathFromPackageJson(\n packageFolder: string,\n packageJson: INodePackageJson\n ): string {\n const tsdocMetadataFilename: string = PackageMetadataManager.tsdocMetadataFilename;\n\n let tsdocMetadataRelativePath: string;\n\n if (packageJson.tsdocMetadata) {\n // 1. If package.json contains a field such as \"tsdocMetadata\": \"./path1/path2/tsdoc-metadata.json\",\n // then that takes precedence. This convention will be rarely needed, since the other rules below generally\n // produce a good result.\n tsdocMetadataRelativePath = packageJson.tsdocMetadata;\n } else if (packageJson.typings) {\n // 2. If package.json contains a field such as \"typings\": \"./path1/path2/index.d.ts\", then we look\n // for the file under \"./path1/path2/tsdoc-metadata.json\"\n tsdocMetadataRelativePath = path.join(path.dirname(packageJson.typings), tsdocMetadataFilename);\n } else if (packageJson.main) {\n // 3. If package.json contains a field such as \"main\": \"./path1/path2/index.js\", then we look for\n // the file under \"./path1/path2/tsdoc-metadata.json\"\n tsdocMetadataRelativePath = path.join(path.dirname(packageJson.main), tsdocMetadataFilename);\n } else {\n // 4. If none of the above rules apply, then by default we look for the file under \"./tsdoc-metadata.json\"\n // since the default entry point is \"./index.js\"\n tsdocMetadataRelativePath = tsdocMetadataFilename;\n }\n\n // Always resolve relative to the package folder.\n const tsdocMetadataPath: string = path.resolve(packageFolder, tsdocMetadataRelativePath);\n return tsdocMetadataPath;\n }\n\n /**\n * @param tsdocMetadataPath - An explicit path that can be configured in api-extractor.json.\n * If this parameter is not an empty string, it overrides the normal path calculation.\n * @returns the absolute path to the TSDoc metadata file\n */\n public static resolveTsdocMetadataPath(\n packageFolder: string,\n packageJson: INodePackageJson,\n tsdocMetadataPath?: string\n ): string {\n if (tsdocMetadataPath) {\n return path.resolve(packageFolder, tsdocMetadataPath);\n }\n return PackageMetadataManager._resolveTsdocMetadataPathFromPackageJson(packageFolder, packageJson);\n }\n\n /**\n * Writes the TSDoc metadata file to the specified output file.\n */\n public static writeTsdocMetadataFile(tsdocMetadataPath: string, newlineKind: NewlineKind): void {\n const fileObject: JsonObject = {\n tsdocVersion: '0.12',\n toolPackages: [\n {\n packageName: '@microsoft/api-extractor',\n packageVersion: Extractor.version\n }\n ]\n };\n\n const fileContent: string =\n '// This file is read by tools that parse documentation comments conforming to the TSDoc standard.\\n' +\n '// It should be published with your NPM package. It should not be tracked by Git.\\n' +\n JsonFile.stringify(fileObject);\n\n FileSystem.writeFile(tsdocMetadataPath, fileContent, {\n convertLineEndings: newlineKind,\n ensureFolderExists: true\n });\n }\n\n /**\n * Finds the package.json in a parent folder of the specified source file, and\n * returns a PackageMetadata object. If no package.json was found, then undefined\n * is returned. The results are cached.\n */\n public tryFetchPackageMetadata(sourceFilePath: string): PackageMetadata | undefined {\n const packageJsonFilePath: string | undefined =\n this._packageJsonLookup.tryGetPackageJsonFilePathFor(sourceFilePath);\n if (!packageJsonFilePath) {\n return undefined;\n }\n let packageMetadata: PackageMetadata | undefined =\n this._packageMetadataByPackageJsonPath.get(packageJsonFilePath);\n\n if (!packageMetadata) {\n const packageJson: INodePackageJson = this._packageJsonLookup.loadNodePackageJson(packageJsonFilePath);\n\n const packageJsonFolder: string = path.dirname(packageJsonFilePath);\n\n let aedocSupported: boolean = false;\n\n const tsdocMetadataPath: string = PackageMetadataManager._resolveTsdocMetadataPathFromPackageJson(\n packageJsonFolder,\n packageJson\n );\n\n if (FileSystem.exists(tsdocMetadataPath)) {\n this._messageRouter.logVerbose(\n ConsoleMessageId.FoundTSDocMetadata,\n 'Found metadata in ' + tsdocMetadataPath\n );\n // If the file exists at all, assume it was written by API Extractor\n aedocSupported = true;\n }\n\n packageMetadata = new PackageMetadata(packageJsonFilePath, packageJson, aedocSupported);\n this._packageMetadataByPackageJsonPath.set(packageJsonFilePath, packageMetadata);\n }\n\n return packageMetadata;\n }\n\n /**\n * Returns true if the source file is part of a package whose .d.ts files support AEDoc annotations.\n */\n public isAedocSupportedFor(sourceFilePath: string): boolean {\n const packageMetadata: PackageMetadata | undefined = this.tryFetchPackageMetadata(sourceFilePath);\n if (!packageMetadata) {\n return false;\n }\n return packageMetadata.aedocSupported;\n }\n}\n"]}
@@ -259,11 +259,11 @@ class TypeScriptHelpers {
259
259
  return text;
260
260
  }
261
261
  }
262
- exports.TypeScriptHelpers = TypeScriptHelpers;
263
262
  // Matches TypeScript's encoded names for well-known ECMAScript symbols like
264
263
  // "__@iterator" or "__@toStringTag".
265
264
  TypeScriptHelpers._wellKnownSymbolNameRegExp = /^__@(\w+)$/;
266
265
  // Matches TypeScript's encoded names for late-bound symbols derived from `unique symbol` declarations
267
266
  // which have the form of "__@<variableName>@<symbolId>", i.e. "__@someSymbol@12345".
268
267
  TypeScriptHelpers._uniqueSymbolNameRegExp = /^__@.*@\d+$/;
268
+ exports.TypeScriptHelpers = TypeScriptHelpers;
269
269
  //# sourceMappingURL=TypeScriptHelpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TypeScriptHelpers.js","sourceRoot":"","sources":["../../src/analyzer/TypeScriptHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/* eslint-disable no-bitwise */\n\nimport * as ts from 'typescript';\nimport { SourceFileLocationFormatter } from './SourceFileLocationFormatter';\nimport { TypeScriptInternals } from './TypeScriptInternals';\nimport { InternalError } from '@rushstack/node-core-library';\n\nexport class TypeScriptHelpers {\n // Matches TypeScript's encoded names for well-known ECMAScript symbols like\n // \"__@iterator\" or \"__@toStringTag\".\n private static readonly _wellKnownSymbolNameRegExp: RegExp = /^__@(\\w+)$/;\n\n // Matches TypeScript's encoded names for late-bound symbols derived from `unique symbol` declarations\n // which have the form of \"__@<variableName>@<symbolId>\", i.e. \"__@someSymbol@12345\".\n private static readonly _uniqueSymbolNameRegExp: RegExp = /^__@.*@\\d+$/;\n\n /**\n * This traverses any symbol aliases to find the original place where an item was defined.\n * For example, suppose a class is defined as \"export default class MyClass { }\"\n * but exported from the package's index.ts like this:\n *\n * export { default as _MyClass } from './MyClass';\n *\n * In this example, calling followAliases() on the _MyClass symbol will return the\n * original definition of MyClass, traversing any intermediary places where the\n * symbol was imported and re-exported.\n */\n public static followAliases(symbol: ts.Symbol, typeChecker: ts.TypeChecker): ts.Symbol {\n let current: ts.Symbol = symbol;\n for (;;) {\n if (!(current.flags & ts.SymbolFlags.Alias)) {\n break;\n }\n const currentAlias: ts.Symbol = typeChecker.getAliasedSymbol(current);\n if (!currentAlias || currentAlias === current) {\n break;\n }\n current = currentAlias;\n }\n\n return current;\n }\n\n /**\n * Returns true if TypeScriptHelpers.followAliases() would return something different\n * from the input `symbol`.\n */\n public static isFollowableAlias(symbol: ts.Symbol, typeChecker: ts.TypeChecker): boolean {\n if (!(symbol.flags & ts.SymbolFlags.Alias)) {\n return false;\n }\n\n const alias: ts.Symbol = typeChecker.getAliasedSymbol(symbol);\n if (!alias || alias === symbol) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Certain virtual symbols do not have any declarations. For example, `ts.TypeChecker.getExportsOfModule()` can\n * sometimes return a \"prototype\" symbol for an object, even though there is no corresponding declaration in the\n * source code. API Extractor generally ignores such symbols.\n */\n public static tryGetADeclaration(symbol: ts.Symbol): ts.Declaration | undefined {\n if (symbol.declarations && symbol.declarations.length > 0) {\n return symbol.declarations[0];\n }\n return undefined;\n }\n\n /**\n * Returns true if the specified symbol is an ambient declaration.\n */\n public static isAmbient(symbol: ts.Symbol, typeChecker: ts.TypeChecker): boolean {\n const followedSymbol: ts.Symbol = TypeScriptHelpers.followAliases(symbol, typeChecker);\n\n if (followedSymbol.declarations && followedSymbol.declarations.length > 0) {\n const firstDeclaration: ts.Declaration = followedSymbol.declarations[0];\n\n // Test 1: Are we inside the sinister \"declare global {\" construct?\n const highestModuleDeclaration: ts.ModuleDeclaration | undefined = TypeScriptHelpers.findHighestParent(\n firstDeclaration,\n ts.SyntaxKind.ModuleDeclaration\n );\n if (highestModuleDeclaration) {\n if (highestModuleDeclaration.name.getText().trim() === 'global') {\n return true;\n }\n }\n\n // Test 2: Otherwise, the main heuristic for ambient declarations is by looking at the\n // ts.SyntaxKind.SourceFile node to see whether it has a symbol or not (i.e. whether it\n // is acting as a module or not).\n const sourceFile: ts.SourceFile = firstDeclaration.getSourceFile();\n\n if (typeChecker.getSymbolAtLocation(sourceFile)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Same semantics as tryGetSymbolForDeclaration(), but throws an exception if the symbol\n * cannot be found.\n */\n public static getSymbolForDeclaration(declaration: ts.Declaration, checker: ts.TypeChecker): ts.Symbol {\n const symbol: ts.Symbol | undefined = TypeScriptInternals.tryGetSymbolForDeclaration(\n declaration,\n checker\n );\n if (!symbol) {\n throw new InternalError(\n 'Unable to determine semantic information for declaration:\\n' +\n SourceFileLocationFormatter.formatDeclaration(declaration)\n );\n }\n return symbol;\n }\n\n // Return name of the module, which could be like \"./SomeLocalFile' or like 'external-package/entry/point'\n public static getModuleSpecifier(\n nodeWithModuleSpecifier: ts.ImportDeclaration | ts.ExportDeclaration | ts.ImportTypeNode\n ): string | undefined {\n if (nodeWithModuleSpecifier.kind === ts.SyntaxKind.ImportType) {\n // As specified internally in typescript:/src/compiler/types.ts#ValidImportTypeNode\n if (\n nodeWithModuleSpecifier.argument.kind !== ts.SyntaxKind.LiteralType ||\n (nodeWithModuleSpecifier.argument as ts.LiteralTypeNode).literal.kind !== ts.SyntaxKind.StringLiteral\n ) {\n throw new InternalError(\n `Invalid ImportTypeNode: ${nodeWithModuleSpecifier.getText()}\\n` +\n SourceFileLocationFormatter.formatDeclaration(nodeWithModuleSpecifier)\n );\n }\n const literalTypeNode: ts.LiteralTypeNode = nodeWithModuleSpecifier.argument as ts.LiteralTypeNode;\n const stringLiteral: ts.StringLiteral = literalTypeNode.literal as ts.StringLiteral;\n return stringLiteral.text.trim();\n }\n\n // Node is a declaration\n if (\n nodeWithModuleSpecifier.moduleSpecifier &&\n ts.isStringLiteralLike(nodeWithModuleSpecifier.moduleSpecifier)\n ) {\n return TypeScriptInternals.getTextOfIdentifierOrLiteral(nodeWithModuleSpecifier.moduleSpecifier);\n }\n\n return undefined;\n }\n\n /**\n * Returns an ancestor of \"node\", such that the ancestor, any intermediary nodes,\n * and the starting node match a list of expected kinds. Undefined is returned\n * if there aren't enough ancestors, or if the kinds are incorrect.\n *\n * For example, suppose child \"C\" has parents A --> B --> C.\n *\n * Calling _matchAncestor(C, [ExportSpecifier, NamedExports, ExportDeclaration])\n * would return A only if A is of kind ExportSpecifier, B is of kind NamedExports,\n * and C is of kind ExportDeclaration.\n *\n * Calling _matchAncestor(C, [ExportDeclaration]) would return C.\n */\n public static matchAncestor<T extends ts.Node>(\n node: ts.Node,\n kindsToMatch: ts.SyntaxKind[]\n ): T | undefined {\n // (slice(0) clones an array)\n const reversedParentKinds: ts.SyntaxKind[] = kindsToMatch.slice(0).reverse();\n\n let current: ts.Node | undefined = undefined;\n\n for (const parentKind of reversedParentKinds) {\n if (!current) {\n // The first time through, start with node\n current = node;\n } else {\n // Then walk the parents\n current = current.parent;\n }\n\n // If we ran out of items, or if the kind doesn't match, then fail\n if (!current || current.kind !== parentKind) {\n return undefined;\n }\n }\n\n // If we matched everything, then return the node that matched the last parentKinds item\n return current as T;\n }\n\n /**\n * Does a depth-first search of the children of the specified node. Returns the first child\n * with the specified kind, or undefined if there is no match.\n */\n public static findFirstChildNode<T extends ts.Node>(\n node: ts.Node,\n kindToMatch: ts.SyntaxKind\n ): T | undefined {\n for (const child of node.getChildren()) {\n if (child.kind === kindToMatch) {\n return child as T;\n }\n\n const recursiveMatch: T | undefined = TypeScriptHelpers.findFirstChildNode(child, kindToMatch);\n if (recursiveMatch) {\n return recursiveMatch;\n }\n }\n\n return undefined;\n }\n\n /**\n * Returns the first parent node with the specified SyntaxKind, or undefined if there is no match.\n */\n public static findFirstParent<T extends ts.Node>(node: ts.Node, kindToMatch: ts.SyntaxKind): T | undefined {\n let current: ts.Node | undefined = node.parent;\n\n while (current) {\n if (current.kind === kindToMatch) {\n return current as T;\n }\n current = current.parent;\n }\n\n return undefined;\n }\n\n /**\n * Returns the highest parent node with the specified SyntaxKind, or undefined if there is no match.\n * @remarks\n * Whereas findFirstParent() returns the first match, findHighestParent() returns the last match.\n */\n public static findHighestParent<T extends ts.Node>(\n node: ts.Node,\n kindToMatch: ts.SyntaxKind\n ): T | undefined {\n let current: ts.Node | undefined = node;\n let highest: T | undefined = undefined;\n\n for (;;) {\n current = TypeScriptHelpers.findFirstParent<T>(current, kindToMatch);\n if (!current) {\n break;\n }\n highest = current as T;\n }\n\n return highest;\n }\n\n /**\n * Decodes the names that the compiler generates for a built-in ECMAScript symbol.\n *\n * @remarks\n * TypeScript binds well-known ECMAScript symbols like `[Symbol.iterator]` as `__@iterator`.\n * If `name` is of this form, then `tryGetWellKnownSymbolName()` converts it back into e.g. `[Symbol.iterator]`.\n * If the string does not start with `__@` then `undefined` is returned.\n */\n public static tryDecodeWellKnownSymbolName(name: ts.__String): string | undefined {\n const match: RegExpExecArray | null = TypeScriptHelpers._wellKnownSymbolNameRegExp.exec(name as string);\n if (match) {\n const identifier: string = match[1];\n return `[Symbol.${identifier}]`;\n }\n return undefined;\n }\n\n /**\n * Returns whether the provided name was generated for a TypeScript `unique symbol`.\n */\n public static isUniqueSymbolName(name: ts.__String): boolean {\n return TypeScriptHelpers._uniqueSymbolNameRegExp.test(name as string);\n }\n\n /**\n * Derives the string representation of a TypeScript late-bound symbol.\n */\n public static tryGetLateBoundName(declarationName: ts.ComputedPropertyName): string | undefined {\n // Create a node printer that ignores comments and indentation that we can use to convert\n // declarationName to a string.\n const printer: ts.Printer = ts.createPrinter(\n { removeComments: true },\n {\n onEmitNode(\n hint: ts.EmitHint,\n node: ts.Node,\n emitCallback: (hint: ts.EmitHint, node: ts.Node) => void\n ): void {\n ts.setEmitFlags(declarationName, ts.EmitFlags.NoIndentation | ts.EmitFlags.SingleLine);\n emitCallback(hint, node);\n }\n }\n );\n const sourceFile: ts.SourceFile = declarationName.getSourceFile();\n const text: string = printer.printNode(ts.EmitHint.Unspecified, declarationName, sourceFile);\n // clean up any emit flags we've set on any nodes in the tree.\n ts.disposeEmitNodes(sourceFile);\n return text;\n }\n}\n"]}
1
+ {"version":3,"file":"TypeScriptHelpers.js","sourceRoot":"","sources":["../../src/analyzer/TypeScriptHelpers.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3D,+BAA+B;AAE/B,+CAAiC;AACjC,+EAA4E;AAC5E,+DAA4D;AAC5D,oEAA6D;AAE7D,MAAa,iBAAiB;IAS5B;;;;;;;;;;OAUG;IACI,MAAM,CAAC,aAAa,CAAC,MAAiB,EAAE,WAA2B;QACxE,IAAI,OAAO,GAAc,MAAM,CAAC;QAChC,SAAS;YACP,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;gBAC3C,MAAM;aACP;YACD,MAAM,YAAY,GAAc,WAAW,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACtE,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,OAAO,EAAE;gBAC7C,MAAM;aACP;YACD,OAAO,GAAG,YAAY,CAAC;SACxB;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,iBAAiB,CAAC,MAAiB,EAAE,WAA2B;QAC5E,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE;YAC1C,OAAO,KAAK,CAAC;SACd;QAED,MAAM,KAAK,GAAc,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE;YAC9B,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,kBAAkB,CAAC,MAAiB;QAChD,IAAI,MAAM,CAAC,YAAY,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACzD,OAAO,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SAC/B;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,SAAS,CAAC,MAAiB,EAAE,WAA2B;QACpE,MAAM,cAAc,GAAc,iBAAiB,CAAC,aAAa,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAEvF,IAAI,cAAc,CAAC,YAAY,IAAI,cAAc,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE;YACzE,MAAM,gBAAgB,GAAmB,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAExE,mEAAmE;YACnE,MAAM,wBAAwB,GAAqC,iBAAiB,CAAC,iBAAiB,CACpG,gBAAgB,EAChB,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAChC,CAAC;YACF,IAAI,wBAAwB,EAAE;gBAC5B,IAAI,wBAAwB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,QAAQ,EAAE;oBAC/D,OAAO,IAAI,CAAC;iBACb;aACF;YAED,sFAAsF;YACtF,uFAAuF;YACvF,iCAAiC;YACjC,MAAM,UAAU,GAAkB,gBAAgB,CAAC,aAAa,EAAE,CAAC;YAEnE,IAAI,WAAW,CAAC,mBAAmB,CAAC,UAAU,CAAC,EAAE;gBAC/C,OAAO,KAAK,CAAC;aACd;SACF;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,uBAAuB,CAAC,WAA2B,EAAE,OAAuB;QACxF,MAAM,MAAM,GAA0B,yCAAmB,CAAC,0BAA0B,CAClF,WAAW,EACX,OAAO,CACR,CAAC;QACF,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,iCAAa,CACrB,6DAA6D;gBAC3D,yDAA2B,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAC7D,CAAC;SACH;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,0GAA0G;IACnG,MAAM,CAAC,kBAAkB,CAC9B,uBAAwF;QAExF,IAAI,uBAAuB,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE;YAC7D,mFAAmF;YACnF,IACE,uBAAuB,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,WAAW;gBAClE,uBAAuB,CAAC,QAA+B,CAAC,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC,UAAU,CAAC,aAAa,EACrG;gBACA,MAAM,IAAI,iCAAa,CACrB,2BAA2B,uBAAuB,CAAC,OAAO,EAAE,IAAI;oBAC9D,yDAA2B,CAAC,iBAAiB,CAAC,uBAAuB,CAAC,CACzE,CAAC;aACH;YACD,MAAM,eAAe,GAAuB,uBAAuB,CAAC,QAA8B,CAAC;YACnG,MAAM,aAAa,GAAqB,eAAe,CAAC,OAA2B,CAAC;YACpF,OAAO,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAClC;QAED,wBAAwB;QACxB,IACE,uBAAuB,CAAC,eAAe;YACvC,EAAE,CAAC,mBAAmB,CAAC,uBAAuB,CAAC,eAAe,CAAC,EAC/D;YACA,OAAO,yCAAmB,CAAC,4BAA4B,CAAC,uBAAuB,CAAC,eAAe,CAAC,CAAC;SAClG;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;;;;;;;;;OAYG;IACI,MAAM,CAAC,aAAa,CACzB,IAAa,EACb,YAA6B;QAE7B,6BAA6B;QAC7B,MAAM,mBAAmB,GAAoB,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAE7E,IAAI,OAAO,GAAwB,SAAS,CAAC;QAE7C,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE;YAC5C,IAAI,CAAC,OAAO,EAAE;gBACZ,0CAA0C;gBAC1C,OAAO,GAAG,IAAI,CAAC;aAChB;iBAAM;gBACL,wBAAwB;gBACxB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;aAC1B;YAED,kEAAkE;YAClE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE;gBAC3C,OAAO,SAAS,CAAC;aAClB;SACF;QAED,wFAAwF;QACxF,OAAO,OAAY,CAAC;IACtB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,kBAAkB,CAC9B,IAAa,EACb,WAA0B;QAE1B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;YACtC,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE;gBAC9B,OAAO,KAAU,CAAC;aACnB;YAED,MAAM,cAAc,GAAkB,iBAAiB,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YAC/F,IAAI,cAAc,EAAE;gBAClB,OAAO,cAAc,CAAC;aACvB;SACF;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,eAAe,CAAoB,IAAa,EAAE,WAA0B;QACxF,IAAI,OAAO,GAAwB,IAAI,CAAC,MAAM,CAAC;QAE/C,OAAO,OAAO,EAAE;YACd,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE;gBAChC,OAAO,OAAY,CAAC;aACrB;YACD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;SAC1B;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,iBAAiB,CAC7B,IAAa,EACb,WAA0B;QAE1B,IAAI,OAAO,GAAwB,IAAI,CAAC;QACxC,IAAI,OAAO,GAAkB,SAAS,CAAC;QAEvC,SAAS;YACP,OAAO,GAAG,iBAAiB,CAAC,eAAe,CAAI,OAAO,EAAE,WAAW,CAAC,CAAC;YACrE,IAAI,CAAC,OAAO,EAAE;gBACZ,MAAM;aACP;YACD,OAAO,GAAG,OAAY,CAAC;SACxB;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,4BAA4B,CAAC,IAAiB;QAC1D,MAAM,KAAK,GAA2B,iBAAiB,CAAC,0BAA0B,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;QACxG,IAAI,KAAK,EAAE;YACT,MAAM,UAAU,GAAW,KAAK,CAAC,CAAC,CAAC,CAAC;YACpC,OAAO,WAAW,UAAU,GAAG,CAAC;SACjC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,kBAAkB,CAAC,IAAiB;QAChD,OAAO,iBAAiB,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAc,CAAC,CAAC;IACxE,CAAC;IAED;;OAEG;IACI,MAAM,CAAC,mBAAmB,CAAC,eAAwC;QACxE,yFAAyF;QACzF,+BAA+B;QAC/B,MAAM,OAAO,GAAe,EAAE,CAAC,aAAa,CAC1C,EAAE,cAAc,EAAE,IAAI,EAAE,EACxB;YACE,UAAU,CACR,IAAiB,EACjB,IAAa,EACb,YAAwD;gBAExD,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,GAAG,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACvF,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC3B,CAAC;SACF,CACF,CAAC;QACF,MAAM,UAAU,GAAkB,eAAe,CAAC,aAAa,EAAE,CAAC;QAClE,MAAM,IAAI,GAAW,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAC7F,8DAA8D;QAC9D,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;;AAxSD,4EAA4E;AAC5E,qCAAqC;AACb,4CAA0B,GAAW,YAAY,CAAC;AAE1E,sGAAsG;AACtG,qFAAqF;AAC7D,yCAAuB,GAAW,aAAa,CAAC;AAP7D,8CAAiB","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/* eslint-disable no-bitwise */\n\nimport * as ts from 'typescript';\nimport { SourceFileLocationFormatter } from './SourceFileLocationFormatter';\nimport { TypeScriptInternals } from './TypeScriptInternals';\nimport { InternalError } from '@rushstack/node-core-library';\n\nexport class TypeScriptHelpers {\n // Matches TypeScript's encoded names for well-known ECMAScript symbols like\n // \"__@iterator\" or \"__@toStringTag\".\n private static readonly _wellKnownSymbolNameRegExp: RegExp = /^__@(\\w+)$/;\n\n // Matches TypeScript's encoded names for late-bound symbols derived from `unique symbol` declarations\n // which have the form of \"__@<variableName>@<symbolId>\", i.e. \"__@someSymbol@12345\".\n private static readonly _uniqueSymbolNameRegExp: RegExp = /^__@.*@\\d+$/;\n\n /**\n * This traverses any symbol aliases to find the original place where an item was defined.\n * For example, suppose a class is defined as \"export default class MyClass { }\"\n * but exported from the package's index.ts like this:\n *\n * export { default as _MyClass } from './MyClass';\n *\n * In this example, calling followAliases() on the _MyClass symbol will return the\n * original definition of MyClass, traversing any intermediary places where the\n * symbol was imported and re-exported.\n */\n public static followAliases(symbol: ts.Symbol, typeChecker: ts.TypeChecker): ts.Symbol {\n let current: ts.Symbol = symbol;\n for (;;) {\n if (!(current.flags & ts.SymbolFlags.Alias)) {\n break;\n }\n const currentAlias: ts.Symbol = typeChecker.getAliasedSymbol(current);\n if (!currentAlias || currentAlias === current) {\n break;\n }\n current = currentAlias;\n }\n\n return current;\n }\n\n /**\n * Returns true if TypeScriptHelpers.followAliases() would return something different\n * from the input `symbol`.\n */\n public static isFollowableAlias(symbol: ts.Symbol, typeChecker: ts.TypeChecker): boolean {\n if (!(symbol.flags & ts.SymbolFlags.Alias)) {\n return false;\n }\n\n const alias: ts.Symbol = typeChecker.getAliasedSymbol(symbol);\n if (!alias || alias === symbol) {\n return false;\n }\n\n return true;\n }\n\n /**\n * Certain virtual symbols do not have any declarations. For example, `ts.TypeChecker.getExportsOfModule()` can\n * sometimes return a \"prototype\" symbol for an object, even though there is no corresponding declaration in the\n * source code. API Extractor generally ignores such symbols.\n */\n public static tryGetADeclaration(symbol: ts.Symbol): ts.Declaration | undefined {\n if (symbol.declarations && symbol.declarations.length > 0) {\n return symbol.declarations[0];\n }\n return undefined;\n }\n\n /**\n * Returns true if the specified symbol is an ambient declaration.\n */\n public static isAmbient(symbol: ts.Symbol, typeChecker: ts.TypeChecker): boolean {\n const followedSymbol: ts.Symbol = TypeScriptHelpers.followAliases(symbol, typeChecker);\n\n if (followedSymbol.declarations && followedSymbol.declarations.length > 0) {\n const firstDeclaration: ts.Declaration = followedSymbol.declarations[0];\n\n // Test 1: Are we inside the sinister \"declare global {\" construct?\n const highestModuleDeclaration: ts.ModuleDeclaration | undefined = TypeScriptHelpers.findHighestParent(\n firstDeclaration,\n ts.SyntaxKind.ModuleDeclaration\n );\n if (highestModuleDeclaration) {\n if (highestModuleDeclaration.name.getText().trim() === 'global') {\n return true;\n }\n }\n\n // Test 2: Otherwise, the main heuristic for ambient declarations is by looking at the\n // ts.SyntaxKind.SourceFile node to see whether it has a symbol or not (i.e. whether it\n // is acting as a module or not).\n const sourceFile: ts.SourceFile = firstDeclaration.getSourceFile();\n\n if (typeChecker.getSymbolAtLocation(sourceFile)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Same semantics as tryGetSymbolForDeclaration(), but throws an exception if the symbol\n * cannot be found.\n */\n public static getSymbolForDeclaration(declaration: ts.Declaration, checker: ts.TypeChecker): ts.Symbol {\n const symbol: ts.Symbol | undefined = TypeScriptInternals.tryGetSymbolForDeclaration(\n declaration,\n checker\n );\n if (!symbol) {\n throw new InternalError(\n 'Unable to determine semantic information for declaration:\\n' +\n SourceFileLocationFormatter.formatDeclaration(declaration)\n );\n }\n return symbol;\n }\n\n // Return name of the module, which could be like \"./SomeLocalFile' or like 'external-package/entry/point'\n public static getModuleSpecifier(\n nodeWithModuleSpecifier: ts.ImportDeclaration | ts.ExportDeclaration | ts.ImportTypeNode\n ): string | undefined {\n if (nodeWithModuleSpecifier.kind === ts.SyntaxKind.ImportType) {\n // As specified internally in typescript:/src/compiler/types.ts#ValidImportTypeNode\n if (\n nodeWithModuleSpecifier.argument.kind !== ts.SyntaxKind.LiteralType ||\n (nodeWithModuleSpecifier.argument as ts.LiteralTypeNode).literal.kind !== ts.SyntaxKind.StringLiteral\n ) {\n throw new InternalError(\n `Invalid ImportTypeNode: ${nodeWithModuleSpecifier.getText()}\\n` +\n SourceFileLocationFormatter.formatDeclaration(nodeWithModuleSpecifier)\n );\n }\n const literalTypeNode: ts.LiteralTypeNode = nodeWithModuleSpecifier.argument as ts.LiteralTypeNode;\n const stringLiteral: ts.StringLiteral = literalTypeNode.literal as ts.StringLiteral;\n return stringLiteral.text.trim();\n }\n\n // Node is a declaration\n if (\n nodeWithModuleSpecifier.moduleSpecifier &&\n ts.isStringLiteralLike(nodeWithModuleSpecifier.moduleSpecifier)\n ) {\n return TypeScriptInternals.getTextOfIdentifierOrLiteral(nodeWithModuleSpecifier.moduleSpecifier);\n }\n\n return undefined;\n }\n\n /**\n * Returns an ancestor of \"node\", such that the ancestor, any intermediary nodes,\n * and the starting node match a list of expected kinds. Undefined is returned\n * if there aren't enough ancestors, or if the kinds are incorrect.\n *\n * For example, suppose child \"C\" has parents A --> B --> C.\n *\n * Calling _matchAncestor(C, [ExportSpecifier, NamedExports, ExportDeclaration])\n * would return A only if A is of kind ExportSpecifier, B is of kind NamedExports,\n * and C is of kind ExportDeclaration.\n *\n * Calling _matchAncestor(C, [ExportDeclaration]) would return C.\n */\n public static matchAncestor<T extends ts.Node>(\n node: ts.Node,\n kindsToMatch: ts.SyntaxKind[]\n ): T | undefined {\n // (slice(0) clones an array)\n const reversedParentKinds: ts.SyntaxKind[] = kindsToMatch.slice(0).reverse();\n\n let current: ts.Node | undefined = undefined;\n\n for (const parentKind of reversedParentKinds) {\n if (!current) {\n // The first time through, start with node\n current = node;\n } else {\n // Then walk the parents\n current = current.parent;\n }\n\n // If we ran out of items, or if the kind doesn't match, then fail\n if (!current || current.kind !== parentKind) {\n return undefined;\n }\n }\n\n // If we matched everything, then return the node that matched the last parentKinds item\n return current as T;\n }\n\n /**\n * Does a depth-first search of the children of the specified node. Returns the first child\n * with the specified kind, or undefined if there is no match.\n */\n public static findFirstChildNode<T extends ts.Node>(\n node: ts.Node,\n kindToMatch: ts.SyntaxKind\n ): T | undefined {\n for (const child of node.getChildren()) {\n if (child.kind === kindToMatch) {\n return child as T;\n }\n\n const recursiveMatch: T | undefined = TypeScriptHelpers.findFirstChildNode(child, kindToMatch);\n if (recursiveMatch) {\n return recursiveMatch;\n }\n }\n\n return undefined;\n }\n\n /**\n * Returns the first parent node with the specified SyntaxKind, or undefined if there is no match.\n */\n public static findFirstParent<T extends ts.Node>(node: ts.Node, kindToMatch: ts.SyntaxKind): T | undefined {\n let current: ts.Node | undefined = node.parent;\n\n while (current) {\n if (current.kind === kindToMatch) {\n return current as T;\n }\n current = current.parent;\n }\n\n return undefined;\n }\n\n /**\n * Returns the highest parent node with the specified SyntaxKind, or undefined if there is no match.\n * @remarks\n * Whereas findFirstParent() returns the first match, findHighestParent() returns the last match.\n */\n public static findHighestParent<T extends ts.Node>(\n node: ts.Node,\n kindToMatch: ts.SyntaxKind\n ): T | undefined {\n let current: ts.Node | undefined = node;\n let highest: T | undefined = undefined;\n\n for (;;) {\n current = TypeScriptHelpers.findFirstParent<T>(current, kindToMatch);\n if (!current) {\n break;\n }\n highest = current as T;\n }\n\n return highest;\n }\n\n /**\n * Decodes the names that the compiler generates for a built-in ECMAScript symbol.\n *\n * @remarks\n * TypeScript binds well-known ECMAScript symbols like `[Symbol.iterator]` as `__@iterator`.\n * If `name` is of this form, then `tryGetWellKnownSymbolName()` converts it back into e.g. `[Symbol.iterator]`.\n * If the string does not start with `__@` then `undefined` is returned.\n */\n public static tryDecodeWellKnownSymbolName(name: ts.__String): string | undefined {\n const match: RegExpExecArray | null = TypeScriptHelpers._wellKnownSymbolNameRegExp.exec(name as string);\n if (match) {\n const identifier: string = match[1];\n return `[Symbol.${identifier}]`;\n }\n return undefined;\n }\n\n /**\n * Returns whether the provided name was generated for a TypeScript `unique symbol`.\n */\n public static isUniqueSymbolName(name: ts.__String): boolean {\n return TypeScriptHelpers._uniqueSymbolNameRegExp.test(name as string);\n }\n\n /**\n * Derives the string representation of a TypeScript late-bound symbol.\n */\n public static tryGetLateBoundName(declarationName: ts.ComputedPropertyName): string | undefined {\n // Create a node printer that ignores comments and indentation that we can use to convert\n // declarationName to a string.\n const printer: ts.Printer = ts.createPrinter(\n { removeComments: true },\n {\n onEmitNode(\n hint: ts.EmitHint,\n node: ts.Node,\n emitCallback: (hint: ts.EmitHint, node: ts.Node) => void\n ): void {\n ts.setEmitFlags(declarationName, ts.EmitFlags.NoIndentation | ts.EmitFlags.SingleLine);\n emitCallback(hint, node);\n }\n }\n );\n const sourceFile: ts.SourceFile = declarationName.getSourceFile();\n const text: string = printer.printNode(ts.EmitHint.Unspecified, declarationName, sourceFile);\n // clean up any emit flags we've set on any nodes in the tree.\n ts.disposeEmitNodes(sourceFile);\n return text;\n }\n}\n"]}
@@ -653,7 +653,6 @@ class ExtractorConfig {
653
653
  throw new Error(`The "${fieldName}" value contains extra token characters ("<" or ">"): ${value}`);
654
654
  }
655
655
  }
656
- exports.ExtractorConfig = ExtractorConfig;
657
656
  /**
658
657
  * The JSON Schema for API Extractor config file (api-extractor.schema.json).
659
658
  */
@@ -670,4 +669,5 @@ ExtractorConfig.FILENAME = 'api-extractor.json';
670
669
  ExtractorConfig._tsdocBaseFilePath = path.resolve(__dirname, '../../extends/tsdoc-base.json');
671
670
  ExtractorConfig._defaultConfig = node_core_library_1.JsonFile.load(path.join(__dirname, '../schemas/api-extractor-defaults.json'));
672
671
  ExtractorConfig._declarationFileExtensionRegExp = /\.d\.ts$/i;
672
+ exports.ExtractorConfig = ExtractorConfig;
673
673
  //# sourceMappingURL=ExtractorConfig.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ExtractorConfig.js","sourceRoot":"","sources":["../../src/api/ExtractorConfig.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\nimport * as resolve from 'resolve';\nimport lodash = require('lodash');\nimport {\n JsonFile,\n JsonSchema,\n FileSystem,\n PackageJsonLookup,\n INodePackageJson,\n PackageName,\n Text,\n InternalError,\n Path,\n NewlineKind\n} from '@rushstack/node-core-library';\nimport { RigConfig } from '@rushstack/rig-package';\n\nimport { IConfigFile, IExtractorMessagesConfig } from './IConfigFile';\nimport { PackageMetadataManager } from '../analyzer/PackageMetadataManager';\nimport { MessageRouter } from '../collector/MessageRouter';\nimport { EnumMemberOrder } from '@microsoft/api-extractor-model';\nimport { TSDocConfiguration } from '@microsoft/tsdoc';\nimport { TSDocConfigFile } from '@microsoft/tsdoc-config';\n\n/**\n * Tokens used during variable expansion of path fields from api-extractor.json.\n */\ninterface IExtractorConfigTokenContext {\n /**\n * The `<unscopedPackageName>` token returns the project's NPM package name, without any NPM scope.\n * If there is no associated package.json file, then the value is `unknown-package`.\n *\n * Example: `my-project`\n */\n unscopedPackageName: string;\n\n /**\n * The `<packageName>` token returns the project's full NPM package name including any NPM scope.\n * If there is no associated package.json file, then the value is `unknown-package`.\n *\n * Example: `@scope/my-project`\n */\n packageName: string;\n\n /**\n * The `<projectFolder>` token returns the expanded `\"projectFolder\"` setting from api-extractor.json.\n */\n projectFolder: string;\n}\n\n/**\n * Options for {@link ExtractorConfig.tryLoadForFolder}.\n *\n * @public\n */\nexport interface IExtractorConfigLoadForFolderOptions {\n /**\n * The folder path to start from when searching for api-extractor.json.\n */\n startingFolder: string;\n\n /**\n * An already constructed `PackageJsonLookup` cache object to use. If omitted, a temporary one will\n * be constructed.\n */\n packageJsonLookup?: PackageJsonLookup;\n\n /**\n * An already constructed `RigConfig` object. If omitted, then a new `RigConfig` object will be constructed.\n */\n rigConfig?: RigConfig;\n}\n\n/**\n * Options for {@link ExtractorConfig.prepare}.\n *\n * @public\n */\nexport interface IExtractorConfigPrepareOptions {\n /**\n * A configuration object as returned by {@link ExtractorConfig.loadFile}.\n */\n configObject: IConfigFile;\n\n /**\n * The absolute path of the file that the `configObject` object was loaded from. This is used for error messages\n * and when probing for `tsconfig.json`.\n *\n * @remarks\n *\n * If `configObjectFullPath` and `projectFolderLookupToken` are both unspecified, then the api-extractor.json\n * config file must explicitly specify a `projectFolder` setting rather than relying on the `<lookup>` token.\n */\n configObjectFullPath: string | undefined;\n\n /**\n * The parsed package.json file for the working package, or undefined if API Extractor was invoked without\n * a package.json file.\n *\n * @remarks\n *\n * If omitted, then the `<unscopedPackageName>` and `<packageName>` tokens will have default values.\n */\n packageJson?: INodePackageJson | undefined;\n\n /**\n * The absolute path of the file that the `packageJson` object was loaded from, or undefined if API Extractor\n * was invoked without a package.json file.\n *\n * @remarks\n *\n * This is used for error messages and when resolving paths found in package.json.\n *\n * If `packageJsonFullPath` is specified but `packageJson` is omitted, the file will be loaded automatically.\n */\n packageJsonFullPath: string | undefined;\n\n /**\n * The default value for the `projectFolder` setting is the `<lookup>` token, which uses a heuristic to guess\n * an appropriate project folder. Use `projectFolderLookupValue` to manually specify the `<lookup>` token value\n * instead.\n *\n * @remarks\n * If the `projectFolder` setting is explicitly specified in api-extractor.json file, it should take precedence\n * over a value specified via the API. Thus the `projectFolderLookupToken` option provides a way to override\n * the default value for `projectFolder` setting while still honoring a manually specified value.\n */\n projectFolderLookupToken?: string;\n\n /**\n * Allow customization of the tsdoc.json config file. If omitted, this file will be loaded from its default\n * location. If the file does not exist, then the standard definitions will be used from\n * `@microsoft/api-extractor/extends/tsdoc-base.json`.\n */\n tsdocConfigFile?: TSDocConfigFile;\n\n /**\n * When preparing the configuration object, folder and file paths referenced in the configuration are checked\n * for existence, and an error is reported if they are not found. This option can be used to disable this\n * check for the main entry point module. This may be useful when preparing a configuration file for an\n * un-built project.\n */\n ignoreMissingEntryPoint?: boolean;\n}\n\ninterface IExtractorConfigParameters {\n projectFolder: string;\n packageJson: INodePackageJson | undefined;\n packageFolder: string | undefined;\n mainEntryPointFilePath: string;\n bundledPackages: string[];\n tsconfigFilePath: string;\n overrideTsconfig: {} | undefined;\n skipLibCheck: boolean;\n apiReportEnabled: boolean;\n reportFilePath: string;\n reportTempFilePath: string;\n apiReportIncludeForgottenExports: boolean;\n docModelEnabled: boolean;\n apiJsonFilePath: string;\n docModelIncludeForgottenExports: boolean;\n projectFolderUrl: string | undefined;\n rollupEnabled: boolean;\n untrimmedFilePath: string;\n alphaTrimmedFilePath: string;\n betaTrimmedFilePath: string;\n publicTrimmedFilePath: string;\n omitTrimmingComments: boolean;\n tsdocMetadataEnabled: boolean;\n tsdocMetadataFilePath: string;\n tsdocConfigFile: TSDocConfigFile;\n tsdocConfiguration: TSDocConfiguration;\n newlineKind: NewlineKind;\n messages: IExtractorMessagesConfig;\n testMode: boolean;\n enumMemberOrder: EnumMemberOrder;\n}\n\n/**\n * The `ExtractorConfig` class loads, validates, interprets, and represents the api-extractor.json config file.\n * @public\n */\nexport class ExtractorConfig {\n /**\n * The JSON Schema for API Extractor config file (api-extractor.schema.json).\n */\n public static readonly jsonSchema: JsonSchema = JsonSchema.fromFile(\n path.join(__dirname, '../schemas/api-extractor.schema.json')\n );\n\n /**\n * The config file name \"api-extractor.json\".\n */\n public static readonly FILENAME: 'api-extractor.json' = 'api-extractor.json';\n\n /**\n * The full path to `extends/tsdoc-base.json` which contains the standard TSDoc configuration\n * for API Extractor.\n * @internal\n */\n public static readonly _tsdocBaseFilePath: string = path.resolve(\n __dirname,\n '../../extends/tsdoc-base.json'\n );\n\n private static readonly _defaultConfig: Partial<IConfigFile> = JsonFile.load(\n path.join(__dirname, '../schemas/api-extractor-defaults.json')\n );\n\n private static readonly _declarationFileExtensionRegExp: RegExp = /\\.d\\.ts$/i;\n\n /** {@inheritDoc IConfigFile.projectFolder} */\n public readonly projectFolder: string;\n\n /**\n * The parsed package.json file for the working package, or undefined if API Extractor was invoked without\n * a package.json file.\n */\n public readonly packageJson: INodePackageJson | undefined;\n\n /**\n * The absolute path of the folder containing the package.json file for the working package, or undefined\n * if API Extractor was invoked without a package.json file.\n */\n public readonly packageFolder: string | undefined;\n\n /** {@inheritDoc IConfigFile.mainEntryPointFilePath} */\n public readonly mainEntryPointFilePath: string;\n\n /** {@inheritDoc IConfigFile.bundledPackages} */\n public readonly bundledPackages: string[];\n\n /** {@inheritDoc IConfigCompiler.tsconfigFilePath} */\n public readonly tsconfigFilePath: string;\n\n /** {@inheritDoc IConfigCompiler.overrideTsconfig} */\n public readonly overrideTsconfig: {} | undefined;\n\n /** {@inheritDoc IConfigCompiler.skipLibCheck} */\n public readonly skipLibCheck: boolean;\n\n /** {@inheritDoc IConfigApiReport.enabled} */\n public readonly apiReportEnabled: boolean;\n\n /** The `reportFolder` path combined with the `reportFileName`. */\n public readonly reportFilePath: string;\n /** The `reportTempFolder` path combined with the `reportFileName`. */\n public readonly reportTempFilePath: string;\n /** {@inheritDoc IConfigApiReport.includeForgottenExports} */\n public readonly apiReportIncludeForgottenExports: boolean;\n\n /** {@inheritDoc IConfigDocModel.enabled} */\n public readonly docModelEnabled: boolean;\n /** {@inheritDoc IConfigDocModel.apiJsonFilePath} */\n public readonly apiJsonFilePath: string;\n /** {@inheritDoc IConfigDocModel.includeForgottenExports} */\n public readonly docModelIncludeForgottenExports: boolean;\n /** {@inheritDoc IConfigDocModel.projectFolderUrl} */\n public readonly projectFolderUrl: string | undefined;\n\n /** {@inheritDoc IConfigDtsRollup.enabled} */\n public readonly rollupEnabled: boolean;\n /** {@inheritDoc IConfigDtsRollup.untrimmedFilePath} */\n public readonly untrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.alphaTrimmedFilePath} */\n public readonly alphaTrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.betaTrimmedFilePath} */\n public readonly betaTrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.publicTrimmedFilePath} */\n public readonly publicTrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.omitTrimmingComments} */\n public readonly omitTrimmingComments: boolean;\n\n /** {@inheritDoc IConfigTsdocMetadata.enabled} */\n public readonly tsdocMetadataEnabled: boolean;\n /** {@inheritDoc IConfigTsdocMetadata.tsdocMetadataFilePath} */\n public readonly tsdocMetadataFilePath: string;\n\n /**\n * The tsdoc.json configuration that will be used when parsing doc comments.\n */\n public readonly tsdocConfigFile: TSDocConfigFile;\n\n /**\n * The `TSDocConfiguration` loaded from {@link ExtractorConfig.tsdocConfigFile}.\n */\n public readonly tsdocConfiguration: TSDocConfiguration;\n\n /**\n * Specifies what type of newlines API Extractor should use when writing output files. By default, the output files\n * will be written with Windows-style newlines.\n */\n public readonly newlineKind: NewlineKind;\n\n /** {@inheritDoc IConfigFile.messages} */\n public readonly messages: IExtractorMessagesConfig;\n\n /** {@inheritDoc IConfigFile.testMode} */\n public readonly testMode: boolean;\n\n /** {@inheritDoc IConfigFile.enumMemberOrder} */\n public readonly enumMemberOrder: EnumMemberOrder;\n\n private constructor(parameters: IExtractorConfigParameters) {\n this.projectFolder = parameters.projectFolder;\n this.packageJson = parameters.packageJson;\n this.packageFolder = parameters.packageFolder;\n this.mainEntryPointFilePath = parameters.mainEntryPointFilePath;\n this.bundledPackages = parameters.bundledPackages;\n this.tsconfigFilePath = parameters.tsconfigFilePath;\n this.overrideTsconfig = parameters.overrideTsconfig;\n this.skipLibCheck = parameters.skipLibCheck;\n this.apiReportEnabled = parameters.apiReportEnabled;\n this.reportFilePath = parameters.reportFilePath;\n this.reportTempFilePath = parameters.reportTempFilePath;\n this.apiReportIncludeForgottenExports = parameters.apiReportIncludeForgottenExports;\n this.docModelEnabled = parameters.docModelEnabled;\n this.apiJsonFilePath = parameters.apiJsonFilePath;\n this.docModelIncludeForgottenExports = parameters.docModelIncludeForgottenExports;\n this.projectFolderUrl = parameters.projectFolderUrl;\n this.rollupEnabled = parameters.rollupEnabled;\n this.untrimmedFilePath = parameters.untrimmedFilePath;\n this.alphaTrimmedFilePath = parameters.alphaTrimmedFilePath;\n this.betaTrimmedFilePath = parameters.betaTrimmedFilePath;\n this.publicTrimmedFilePath = parameters.publicTrimmedFilePath;\n this.omitTrimmingComments = parameters.omitTrimmingComments;\n this.tsdocMetadataEnabled = parameters.tsdocMetadataEnabled;\n this.tsdocMetadataFilePath = parameters.tsdocMetadataFilePath;\n this.tsdocConfigFile = parameters.tsdocConfigFile;\n this.tsdocConfiguration = parameters.tsdocConfiguration;\n this.newlineKind = parameters.newlineKind;\n this.messages = parameters.messages;\n this.testMode = parameters.testMode;\n this.enumMemberOrder = parameters.enumMemberOrder;\n }\n\n /**\n * Returns a JSON-like string representing the `ExtractorConfig` state, which can be printed to a console\n * for diagnostic purposes.\n *\n * @remarks\n * This is used by the \"--diagnostics\" command-line option. The string is not intended to be deserialized;\n * its format may be changed at any time.\n */\n public getDiagnosticDump(): string {\n // Handle the simple JSON-serializable properties using buildJsonDumpObject()\n const result: object = MessageRouter.buildJsonDumpObject(this, {\n keyNamesToOmit: ['tsdocConfigFile', 'tsdocConfiguration']\n });\n\n // Implement custom formatting for tsdocConfigFile and tsdocConfiguration\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (result as any).tsdocConfigFile = {\n filePath: this.tsdocConfigFile.filePath,\n log: this.tsdocConfigFile.log.messages.map((x) => x.toString())\n };\n\n return JSON.stringify(result, undefined, 2);\n }\n\n /**\n * Returns a simplified file path for use in error messages.\n * @internal\n */\n public _getShortFilePath(absolutePath: string): string {\n if (!path.isAbsolute(absolutePath)) {\n throw new InternalError('Expected absolute path: ' + absolutePath);\n }\n if (Path.isUnderOrEqual(absolutePath, this.projectFolder)) {\n return Path.convertToSlashes(path.relative(this.projectFolder, absolutePath));\n }\n return absolutePath;\n }\n\n /**\n * Searches for the api-extractor.json config file associated with the specified starting folder,\n * and loads the file if found. This lookup supports\n * {@link https://www.npmjs.com/package/@rushstack/rig-package | rig packages}.\n *\n * @remarks\n * The search will first look for a package.json file in a parent folder of the starting folder;\n * if found, that will be used as the base folder instead of the starting folder. If the config\n * file is not found in `<baseFolder>/api-extractor.json` or `<baseFolder>/config/api-extractor.json`,\n * then `<baseFolder/config/rig.json` will be checked to see whether a\n * {@link https://www.npmjs.com/package/@rushstack/rig-package | rig package} is referenced; if so then\n * the rig's api-extractor.json file will be used instead. If a config file is found, it will be loaded\n * and returned with the `IExtractorConfigPrepareOptions` object. Otherwise, `undefined` is returned\n * to indicate that API Extractor does not appear to be configured for the specified folder.\n *\n * @returns An options object that can be passed to {@link ExtractorConfig.prepare}, or `undefined`\n * if not api-extractor.json file was found.\n */\n public static tryLoadForFolder(\n options: IExtractorConfigLoadForFolderOptions\n ): IExtractorConfigPrepareOptions | undefined {\n const packageJsonLookup: PackageJsonLookup = options.packageJsonLookup || new PackageJsonLookup();\n const startingFolder: string = options.startingFolder;\n\n // Figure out which project we're in and look for the config file at the project root\n const packageJsonFullPath: string | undefined =\n packageJsonLookup.tryGetPackageJsonFilePathFor(startingFolder);\n const packageFolder: string | undefined = packageJsonFullPath\n ? path.dirname(packageJsonFullPath)\n : undefined;\n\n // If there is no package, then just use the starting folder\n const baseFolder: string = packageFolder || startingFolder;\n\n let projectFolderLookupToken: string | undefined = undefined;\n\n // First try the standard \"config\" subfolder:\n let configFilename: string = path.join(baseFolder, 'config', ExtractorConfig.FILENAME);\n if (FileSystem.exists(configFilename)) {\n if (FileSystem.exists(path.join(baseFolder, ExtractorConfig.FILENAME))) {\n throw new Error(`Found conflicting ${ExtractorConfig.FILENAME} files in \".\" and \"./config\" folders`);\n }\n } else {\n // Otherwise try the top-level folder\n configFilename = path.join(baseFolder, ExtractorConfig.FILENAME);\n\n if (!FileSystem.exists(configFilename)) {\n // If We didn't find it in <packageFolder>/api-extractor.json or <packageFolder>/config/api-extractor.json\n // then check for a rig package\n if (packageFolder) {\n let rigConfig: RigConfig;\n if (options.rigConfig) {\n // The caller provided an already solved RigConfig. Double-check that it is for the right project.\n if (!Path.isEqual(options.rigConfig.projectFolderPath, packageFolder)) {\n throw new Error(\n 'The provided ILoadForFolderOptions.rigConfig is for the wrong project folder:\\n' +\n '\\nExpected path: ' +\n packageFolder +\n '\\nProvided path: ' +\n options.rigConfig.projectFolderOriginalPath\n );\n }\n rigConfig = options.rigConfig;\n } else {\n rigConfig = RigConfig.loadForProjectFolder({\n projectFolderPath: packageFolder\n });\n }\n\n if (rigConfig.rigFound) {\n configFilename = path.join(rigConfig.getResolvedProfileFolder(), ExtractorConfig.FILENAME);\n\n // If the \"projectFolder\" setting isn't specified in api-extractor.json, it defaults to the\n // \"<lookup>\" token which will probe for the tsconfig.json nearest to the api-extractor.json path.\n // But this won't work if api-extractor.json belongs to the rig. So instead \"<lookup>\" should be\n // the \"<packageFolder>\" that referenced the rig.\n projectFolderLookupToken = packageFolder;\n }\n }\n if (!FileSystem.exists(configFilename)) {\n // API Extractor does not seem to be configured for this folder\n return undefined;\n }\n }\n }\n\n const configObjectFullPath: string = path.resolve(configFilename);\n const configObject: IConfigFile = ExtractorConfig.loadFile(configObjectFullPath);\n\n return {\n configObject,\n configObjectFullPath,\n packageJsonFullPath,\n projectFolderLookupToken\n };\n }\n\n /**\n * Loads the api-extractor.json config file from the specified file path, and prepares an `ExtractorConfig` object.\n *\n * @remarks\n * Loads the api-extractor.json config file from the specified file path. If the \"extends\" field is present,\n * the referenced file(s) will be merged. For any omitted fields, the API Extractor default values are merged.\n *\n * The result is prepared using `ExtractorConfig.prepare()`.\n */\n public static loadFileAndPrepare(configJsonFilePath: string): ExtractorConfig {\n const configObjectFullPath: string = path.resolve(configJsonFilePath);\n const configObject: IConfigFile = ExtractorConfig.loadFile(configObjectFullPath);\n\n const packageJsonLookup: PackageJsonLookup = new PackageJsonLookup();\n const packageJsonFullPath: string | undefined =\n packageJsonLookup.tryGetPackageJsonFilePathFor(configObjectFullPath);\n\n const extractorConfig: ExtractorConfig = ExtractorConfig.prepare({\n configObject,\n configObjectFullPath,\n packageJsonFullPath\n });\n\n return extractorConfig;\n }\n\n /**\n * Performs only the first half of {@link ExtractorConfig.loadFileAndPrepare}, providing an opportunity to\n * modify the object before it is passed to {@link ExtractorConfig.prepare}.\n *\n * @remarks\n * Loads the api-extractor.json config file from the specified file path. If the \"extends\" field is present,\n * the referenced file(s) will be merged. For any omitted fields, the API Extractor default values are merged.\n */\n public static loadFile(jsonFilePath: string): IConfigFile {\n // Set to keep track of config files which have been processed.\n const visitedPaths: Set<string> = new Set<string>();\n\n let currentConfigFilePath: string = path.resolve(jsonFilePath);\n let configObject: Partial<IConfigFile> = {};\n\n try {\n do {\n // Check if this file was already processed.\n if (visitedPaths.has(currentConfigFilePath)) {\n throw new Error(\n `The API Extractor \"extends\" setting contains a cycle.` +\n ` This file is included twice: \"${currentConfigFilePath}\"`\n );\n }\n visitedPaths.add(currentConfigFilePath);\n\n const currentConfigFolderPath: string = path.dirname(currentConfigFilePath);\n\n // Load the extractor config defined in extends property.\n const baseConfig: IConfigFile = JsonFile.load(currentConfigFilePath);\n\n let extendsField: string = baseConfig.extends || '';\n\n // Delete the \"extends\" field so it doesn't get merged\n delete baseConfig.extends;\n\n if (extendsField) {\n if (extendsField.match(/^\\.\\.?[\\\\/]/)) {\n // EXAMPLE: \"./subfolder/api-extractor-base.json\"\n extendsField = path.resolve(currentConfigFolderPath, extendsField);\n } else {\n // EXAMPLE: \"my-package/api-extractor-base.json\"\n //\n // Resolve \"my-package\" from the perspective of the current folder.\n try {\n extendsField = resolve.sync(extendsField, {\n basedir: currentConfigFolderPath\n });\n } catch (e) {\n throw new Error(`Error resolving NodeJS path \"${extendsField}\": ${(e as Error).message}`);\n }\n }\n }\n\n // This step has to be performed in advance, since the currentConfigFolderPath information will be lost\n // after lodash.merge() is performed.\n ExtractorConfig._resolveConfigFileRelativePaths(baseConfig, currentConfigFolderPath);\n\n // Merge extractorConfig into baseConfig, mutating baseConfig\n lodash.merge(baseConfig, configObject);\n configObject = baseConfig;\n\n currentConfigFilePath = extendsField;\n } while (currentConfigFilePath);\n } catch (e) {\n throw new Error(`Error loading ${currentConfigFilePath}:\\n` + (e as Error).message);\n }\n\n // Lastly, apply the defaults\n configObject = lodash.merge(lodash.cloneDeep(ExtractorConfig._defaultConfig), configObject);\n\n ExtractorConfig.jsonSchema.validateObject(configObject, jsonFilePath);\n\n // The schema validation should ensure that this object conforms to IConfigFile\n return configObject as IConfigFile;\n }\n\n private static _resolveConfigFileRelativePaths(\n configFile: IConfigFile,\n currentConfigFolderPath: string\n ): void {\n if (configFile.projectFolder) {\n configFile.projectFolder = ExtractorConfig._resolveConfigFileRelativePath(\n 'projectFolder',\n configFile.projectFolder,\n currentConfigFolderPath\n );\n }\n\n if (configFile.mainEntryPointFilePath) {\n configFile.mainEntryPointFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'mainEntryPointFilePath',\n configFile.mainEntryPointFilePath,\n currentConfigFolderPath\n );\n }\n\n if (configFile.compiler) {\n if (configFile.compiler.tsconfigFilePath) {\n configFile.compiler.tsconfigFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'tsconfigFilePath',\n configFile.compiler.tsconfigFilePath,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.apiReport) {\n if (configFile.apiReport.reportFolder) {\n configFile.apiReport.reportFolder = ExtractorConfig._resolveConfigFileRelativePath(\n 'reportFolder',\n configFile.apiReport.reportFolder,\n currentConfigFolderPath\n );\n }\n if (configFile.apiReport.reportTempFolder) {\n configFile.apiReport.reportTempFolder = ExtractorConfig._resolveConfigFileRelativePath(\n 'reportTempFolder',\n configFile.apiReport.reportTempFolder,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.docModel) {\n if (configFile.docModel.apiJsonFilePath) {\n configFile.docModel.apiJsonFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'apiJsonFilePath',\n configFile.docModel.apiJsonFilePath,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.dtsRollup) {\n if (configFile.dtsRollup.untrimmedFilePath) {\n configFile.dtsRollup.untrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'untrimmedFilePath',\n configFile.dtsRollup.untrimmedFilePath,\n currentConfigFolderPath\n );\n }\n if (configFile.dtsRollup.alphaTrimmedFilePath) {\n configFile.dtsRollup.alphaTrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'alphaTrimmedFilePath',\n configFile.dtsRollup.alphaTrimmedFilePath,\n currentConfigFolderPath\n );\n }\n if (configFile.dtsRollup.betaTrimmedFilePath) {\n configFile.dtsRollup.betaTrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'betaTrimmedFilePath',\n configFile.dtsRollup.betaTrimmedFilePath,\n currentConfigFolderPath\n );\n }\n if (configFile.dtsRollup.publicTrimmedFilePath) {\n configFile.dtsRollup.publicTrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'publicTrimmedFilePath',\n configFile.dtsRollup.publicTrimmedFilePath,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.tsdocMetadata) {\n if (configFile.tsdocMetadata.tsdocMetadataFilePath) {\n configFile.tsdocMetadata.tsdocMetadataFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'tsdocMetadataFilePath',\n configFile.tsdocMetadata.tsdocMetadataFilePath,\n currentConfigFolderPath\n );\n }\n }\n }\n\n private static _resolveConfigFileRelativePath(\n fieldName: string,\n fieldValue: string,\n currentConfigFolderPath: string\n ): string {\n if (!path.isAbsolute(fieldValue)) {\n if (fieldValue.indexOf('<projectFolder>') !== 0) {\n // If the path is not absolute and does not start with \"<projectFolder>\", then resolve it relative\n // to the folder of the config file that it appears in\n return path.join(currentConfigFolderPath, fieldValue);\n }\n }\n\n return fieldValue;\n }\n\n /**\n * Prepares an `ExtractorConfig` object using a configuration that is provided as a runtime object,\n * rather than reading it from disk. This allows configurations to be constructed programmatically,\n * loaded from an alternate source, and/or customized after loading.\n */\n public static prepare(options: IExtractorConfigPrepareOptions): ExtractorConfig {\n const filenameForErrors: string = options.configObjectFullPath || 'the configuration object';\n const configObject: Partial<IConfigFile> = options.configObject;\n\n if (configObject.extends) {\n throw new Error(\n 'The IConfigFile.extends field must be expanded before calling ExtractorConfig.prepare()'\n );\n }\n\n if (options.configObjectFullPath) {\n if (!path.isAbsolute(options.configObjectFullPath)) {\n throw new Error('The \"configObjectFullPath\" setting must be an absolute path');\n }\n }\n\n ExtractorConfig.jsonSchema.validateObject(configObject, filenameForErrors);\n\n const packageJsonFullPath: string | undefined = options.packageJsonFullPath;\n let packageFolder: string | undefined = undefined;\n let packageJson: INodePackageJson | undefined = undefined;\n\n if (packageJsonFullPath) {\n if (!/.json$/i.test(packageJsonFullPath)) {\n // Catch common mistakes e.g. where someone passes a folder path instead of a file path\n throw new Error('The \"packageJsonFullPath\" setting does not have a .json file extension');\n }\n if (!path.isAbsolute(packageJsonFullPath)) {\n throw new Error('The \"packageJsonFullPath\" setting must be an absolute path');\n }\n\n if (options.packageJson) {\n packageJson = options.packageJson;\n } else {\n const packageJsonLookup: PackageJsonLookup = new PackageJsonLookup();\n packageJson = packageJsonLookup.loadNodePackageJson(packageJsonFullPath);\n }\n\n packageFolder = path.dirname(packageJsonFullPath);\n }\n\n // \"tsdocConfigFile\" and \"tsdocConfiguration\" are prepared outside the try-catch block,\n // so that if exceptions are thrown, it will not get the \"Error parsing api-extractor.json:\" header\n let extractorConfigParameters: Omit<IExtractorConfigParameters, 'tsdocConfigFile' | 'tsdocConfiguration'>;\n\n try {\n if (!configObject.compiler) {\n // A merged configuration should have this\n throw new Error('The \"compiler\" section is missing');\n }\n\n if (!configObject.projectFolder) {\n // A merged configuration should have this\n throw new Error('The \"projectFolder\" setting is missing');\n }\n\n let projectFolder: string;\n if (configObject.projectFolder.trim() === '<lookup>') {\n if (options.projectFolderLookupToken) {\n // Use the manually specified \"<lookup>\" value\n projectFolder = options.projectFolderLookupToken;\n\n if (!FileSystem.exists(options.projectFolderLookupToken)) {\n throw new Error(\n 'The specified \"projectFolderLookupToken\" path does not exist: ' +\n options.projectFolderLookupToken\n );\n }\n } else {\n if (!options.configObjectFullPath) {\n throw new Error(\n 'The \"projectFolder\" setting uses the \"<lookup>\" token, but it cannot be expanded because' +\n ' the \"configObjectFullPath\" setting was not specified'\n );\n }\n\n // \"The default value for `projectFolder` is the token `<lookup>`, which means the folder is determined\n // by traversing parent folders, starting from the folder containing api-extractor.json, and stopping\n // at the first folder that contains a tsconfig.json file. If a tsconfig.json file cannot be found in\n // this way, then an error will be reported.\"\n\n let currentFolder: string = path.dirname(options.configObjectFullPath);\n for (;;) {\n const tsconfigPath: string = path.join(currentFolder, 'tsconfig.json');\n if (FileSystem.exists(tsconfigPath)) {\n projectFolder = currentFolder;\n break;\n }\n const parentFolder: string = path.dirname(currentFolder);\n if (parentFolder === '' || parentFolder === currentFolder) {\n throw new Error(\n 'The \"projectFolder\" setting uses the \"<lookup>\" token, but a tsconfig.json file cannot be' +\n ' found in this folder or any parent folder.'\n );\n }\n currentFolder = parentFolder;\n }\n }\n } else {\n ExtractorConfig._rejectAnyTokensInPath(configObject.projectFolder, 'projectFolder');\n\n if (!FileSystem.exists(configObject.projectFolder)) {\n throw new Error('The specified \"projectFolder\" path does not exist: ' + configObject.projectFolder);\n }\n\n projectFolder = configObject.projectFolder;\n }\n\n const tokenContext: IExtractorConfigTokenContext = {\n unscopedPackageName: 'unknown-package',\n packageName: 'unknown-package',\n projectFolder: projectFolder\n };\n\n if (packageJson) {\n tokenContext.packageName = packageJson.name;\n tokenContext.unscopedPackageName = PackageName.getUnscopedName(packageJson.name);\n }\n\n if (!configObject.mainEntryPointFilePath) {\n // A merged configuration should have this\n throw new Error('The \"mainEntryPointFilePath\" setting is missing');\n }\n const mainEntryPointFilePath: string = ExtractorConfig._resolvePathWithTokens(\n 'mainEntryPointFilePath',\n configObject.mainEntryPointFilePath,\n tokenContext\n );\n\n if (!ExtractorConfig.hasDtsFileExtension(mainEntryPointFilePath)) {\n throw new Error(\n 'The \"mainEntryPointFilePath\" value is not a declaration file: ' + mainEntryPointFilePath\n );\n }\n\n if (!options.ignoreMissingEntryPoint && !FileSystem.exists(mainEntryPointFilePath)) {\n throw new Error('The \"mainEntryPointFilePath\" path does not exist: ' + mainEntryPointFilePath);\n }\n\n const bundledPackages: string[] = configObject.bundledPackages || [];\n for (const bundledPackage of bundledPackages) {\n if (!PackageName.isValidName(bundledPackage)) {\n throw new Error(`The \"bundledPackages\" list contains an invalid package name: \"${bundledPackage}\"`);\n }\n }\n\n const tsconfigFilePath: string = ExtractorConfig._resolvePathWithTokens(\n 'tsconfigFilePath',\n configObject.compiler.tsconfigFilePath,\n tokenContext\n );\n\n if (configObject.compiler.overrideTsconfig === undefined) {\n if (!tsconfigFilePath) {\n throw new Error('Either the \"tsconfigFilePath\" or \"overrideTsconfig\" setting must be specified');\n }\n if (!FileSystem.exists(tsconfigFilePath)) {\n throw new Error('The file referenced by \"tsconfigFilePath\" does not exist: ' + tsconfigFilePath);\n }\n }\n\n let apiReportEnabled: boolean = false;\n let reportFilePath: string = '';\n let reportTempFilePath: string = '';\n let apiReportIncludeForgottenExports: boolean = false;\n if (configObject.apiReport) {\n apiReportEnabled = !!configObject.apiReport.enabled;\n\n const reportFilename: string = ExtractorConfig._expandStringWithTokens(\n 'reportFileName',\n configObject.apiReport.reportFileName || '',\n tokenContext\n );\n\n if (!reportFilename) {\n // A merged configuration should have this\n throw new Error('The \"reportFilename\" setting is missing');\n }\n if (reportFilename.indexOf('/') >= 0 || reportFilename.indexOf('\\\\') >= 0) {\n // A merged configuration should have this\n throw new Error(`The \"reportFilename\" setting contains invalid characters: \"${reportFilename}\"`);\n }\n\n const reportFolder: string = ExtractorConfig._resolvePathWithTokens(\n 'reportFolder',\n configObject.apiReport.reportFolder,\n tokenContext\n );\n const reportTempFolder: string = ExtractorConfig._resolvePathWithTokens(\n 'reportTempFolder',\n configObject.apiReport.reportTempFolder,\n tokenContext\n );\n\n reportFilePath = path.join(reportFolder, reportFilename);\n reportTempFilePath = path.join(reportTempFolder, reportFilename);\n apiReportIncludeForgottenExports = !!configObject.apiReport.includeForgottenExports;\n }\n\n let docModelEnabled: boolean = false;\n let apiJsonFilePath: string = '';\n let docModelIncludeForgottenExports: boolean = false;\n let projectFolderUrl: string | undefined;\n if (configObject.docModel) {\n docModelEnabled = !!configObject.docModel.enabled;\n apiJsonFilePath = ExtractorConfig._resolvePathWithTokens(\n 'apiJsonFilePath',\n configObject.docModel.apiJsonFilePath,\n tokenContext\n );\n docModelIncludeForgottenExports = !!configObject.docModel.includeForgottenExports;\n projectFolderUrl = configObject.docModel.projectFolderUrl;\n }\n\n let tsdocMetadataEnabled: boolean = false;\n let tsdocMetadataFilePath: string = '';\n if (configObject.tsdocMetadata) {\n tsdocMetadataEnabled = !!configObject.tsdocMetadata.enabled;\n\n if (tsdocMetadataEnabled) {\n tsdocMetadataFilePath = configObject.tsdocMetadata.tsdocMetadataFilePath || '';\n\n if (tsdocMetadataFilePath.trim() === '<lookup>') {\n if (!packageJson) {\n throw new Error(\n 'The \"<lookup>\" token cannot be used with the \"tsdocMetadataFilePath\" setting because' +\n ' the \"packageJson\" option was not provided'\n );\n }\n if (!packageJsonFullPath) {\n throw new Error(\n 'The \"<lookup>\" token cannot be used with \"tsdocMetadataFilePath\" because' +\n 'the \"packageJsonFullPath\" option was not provided'\n );\n }\n tsdocMetadataFilePath = PackageMetadataManager.resolveTsdocMetadataPath(\n path.dirname(packageJsonFullPath),\n packageJson\n );\n } else {\n tsdocMetadataFilePath = ExtractorConfig._resolvePathWithTokens(\n 'tsdocMetadataFilePath',\n configObject.tsdocMetadata.tsdocMetadataFilePath,\n tokenContext\n );\n }\n\n if (!tsdocMetadataFilePath) {\n throw new Error(\n 'The \"tsdocMetadata.enabled\" setting is enabled,' +\n ' but \"tsdocMetadataFilePath\" is not specified'\n );\n }\n }\n }\n\n let rollupEnabled: boolean = false;\n let untrimmedFilePath: string = '';\n let betaTrimmedFilePath: string = '';\n let alphaTrimmedFilePath: string = '';\n let publicTrimmedFilePath: string = '';\n let omitTrimmingComments: boolean = false;\n\n if (configObject.dtsRollup) {\n rollupEnabled = !!configObject.dtsRollup.enabled;\n untrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'untrimmedFilePath',\n configObject.dtsRollup.untrimmedFilePath,\n tokenContext\n );\n alphaTrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'alphaTrimmedFilePath',\n configObject.dtsRollup.alphaTrimmedFilePath,\n tokenContext\n );\n betaTrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'betaTrimmedFilePath',\n configObject.dtsRollup.betaTrimmedFilePath,\n tokenContext\n );\n publicTrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'publicTrimmedFilePath',\n configObject.dtsRollup.publicTrimmedFilePath,\n tokenContext\n );\n omitTrimmingComments = !!configObject.dtsRollup.omitTrimmingComments;\n }\n\n let newlineKind: NewlineKind;\n switch (configObject.newlineKind) {\n case 'lf':\n newlineKind = NewlineKind.Lf;\n break;\n case 'os':\n newlineKind = NewlineKind.OsDefault;\n break;\n default:\n newlineKind = NewlineKind.CrLf;\n break;\n }\n\n const enumMemberOrder: EnumMemberOrder = configObject.enumMemberOrder ?? EnumMemberOrder.ByName;\n\n extractorConfigParameters = {\n projectFolder: projectFolder,\n packageJson,\n packageFolder,\n mainEntryPointFilePath,\n bundledPackages,\n tsconfigFilePath,\n overrideTsconfig: configObject.compiler.overrideTsconfig,\n skipLibCheck: !!configObject.compiler.skipLibCheck,\n apiReportEnabled,\n reportFilePath,\n reportTempFilePath,\n apiReportIncludeForgottenExports,\n docModelEnabled,\n apiJsonFilePath,\n docModelIncludeForgottenExports,\n projectFolderUrl,\n rollupEnabled,\n untrimmedFilePath,\n alphaTrimmedFilePath,\n betaTrimmedFilePath,\n publicTrimmedFilePath,\n omitTrimmingComments,\n tsdocMetadataEnabled,\n tsdocMetadataFilePath,\n newlineKind,\n messages: configObject.messages || {},\n testMode: !!configObject.testMode,\n enumMemberOrder\n };\n } catch (e) {\n throw new Error(`Error parsing ${filenameForErrors}:\\n` + (e as Error).message);\n }\n\n let tsdocConfigFile: TSDocConfigFile | undefined = options.tsdocConfigFile;\n\n if (!tsdocConfigFile) {\n // Example: \"my-project/tsdoc.json\"\n let packageTSDocConfigPath: string = TSDocConfigFile.findConfigPathForFolder(\n extractorConfigParameters.projectFolder\n );\n\n if (!packageTSDocConfigPath || !FileSystem.exists(packageTSDocConfigPath)) {\n // If the project does not have a tsdoc.json config file, then use API Extractor's base file.\n packageTSDocConfigPath = ExtractorConfig._tsdocBaseFilePath;\n if (!FileSystem.exists(packageTSDocConfigPath)) {\n throw new InternalError('Unable to load the built-in TSDoc config file: ' + packageTSDocConfigPath);\n }\n }\n tsdocConfigFile = TSDocConfigFile.loadFile(packageTSDocConfigPath);\n }\n\n // IMPORTANT: After calling TSDocConfigFile.loadFile(), we need to check for errors.\n if (tsdocConfigFile.hasErrors) {\n throw new Error(tsdocConfigFile.getErrorSummary());\n }\n\n const tsdocConfiguration: TSDocConfiguration = new TSDocConfiguration();\n tsdocConfigFile.configureParser(tsdocConfiguration);\n\n // IMPORTANT: After calling TSDocConfigFile.configureParser(), we need to check for errors a second time.\n if (tsdocConfigFile.hasErrors) {\n throw new Error(tsdocConfigFile.getErrorSummary());\n }\n\n return new ExtractorConfig({ ...extractorConfigParameters, tsdocConfigFile, tsdocConfiguration });\n }\n\n private static _resolvePathWithTokens(\n fieldName: string,\n value: string | undefined,\n tokenContext: IExtractorConfigTokenContext\n ): string {\n value = ExtractorConfig._expandStringWithTokens(fieldName, value, tokenContext);\n if (value !== '') {\n value = path.resolve(tokenContext.projectFolder, value);\n }\n return value;\n }\n\n private static _expandStringWithTokens(\n fieldName: string,\n value: string | undefined,\n tokenContext: IExtractorConfigTokenContext\n ): string {\n value = value ? value.trim() : '';\n if (value !== '') {\n value = Text.replaceAll(value, '<unscopedPackageName>', tokenContext.unscopedPackageName);\n value = Text.replaceAll(value, '<packageName>', tokenContext.packageName);\n\n const projectFolderToken: string = '<projectFolder>';\n if (value.indexOf(projectFolderToken) === 0) {\n // Replace \"<projectFolder>\" at the start of a string\n value = path.join(tokenContext.projectFolder, value.substr(projectFolderToken.length));\n }\n\n if (value.indexOf(projectFolderToken) >= 0) {\n // If after all replacements, \"<projectFolder>\" appears somewhere in the string, report an error\n throw new Error(\n `The \"${fieldName}\" value incorrectly uses the \"<projectFolder>\" token.` +\n ` It must appear at the start of the string.`\n );\n }\n\n if (value.indexOf('<lookup>') >= 0) {\n throw new Error(`The \"${fieldName}\" value incorrectly uses the \"<lookup>\" token`);\n }\n ExtractorConfig._rejectAnyTokensInPath(value, fieldName);\n }\n return value;\n }\n\n /**\n * Returns true if the specified file path has the \".d.ts\" file extension.\n */\n public static hasDtsFileExtension(filePath: string): boolean {\n return ExtractorConfig._declarationFileExtensionRegExp.test(filePath);\n }\n\n /**\n * Given a path string that may have originally contained expandable tokens such as `<projectFolder>\"`\n * this reports an error if any token-looking substrings remain after expansion (e.g. `c:\\blah\\<invalid>\\blah`).\n */\n private static _rejectAnyTokensInPath(value: string, fieldName: string): void {\n if (value.indexOf('<') < 0 && value.indexOf('>') < 0) {\n return;\n }\n\n // Can we determine the name of a token?\n const tokenRegExp: RegExp = /(\\<[^<]*?\\>)/;\n const match: RegExpExecArray | null = tokenRegExp.exec(value);\n if (match) {\n throw new Error(`The \"${fieldName}\" value contains an unrecognized token \"${match[1]}\"`);\n }\n throw new Error(`The \"${fieldName}\" value contains extra token characters (\"<\" or \">\"): ${value}`);\n }\n}\n"]}
1
+ {"version":3,"file":"ExtractorConfig.js","sourceRoot":"","sources":["../../src/api/ExtractorConfig.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as path from 'path';\nimport * as resolve from 'resolve';\nimport lodash = require('lodash');\nimport {\n JsonFile,\n JsonSchema,\n FileSystem,\n PackageJsonLookup,\n INodePackageJson,\n PackageName,\n Text,\n InternalError,\n Path,\n NewlineKind\n} from '@rushstack/node-core-library';\nimport { RigConfig } from '@rushstack/rig-package';\n\nimport { IConfigFile, IExtractorMessagesConfig } from './IConfigFile';\nimport { PackageMetadataManager } from '../analyzer/PackageMetadataManager';\nimport { MessageRouter } from '../collector/MessageRouter';\nimport { EnumMemberOrder } from '@microsoft/api-extractor-model';\nimport { TSDocConfiguration } from '@microsoft/tsdoc';\nimport { TSDocConfigFile } from '@microsoft/tsdoc-config';\n\n/**\n * Tokens used during variable expansion of path fields from api-extractor.json.\n */\ninterface IExtractorConfigTokenContext {\n /**\n * The `<unscopedPackageName>` token returns the project's NPM package name, without any NPM scope.\n * If there is no associated package.json file, then the value is `unknown-package`.\n *\n * Example: `my-project`\n */\n unscopedPackageName: string;\n\n /**\n * The `<packageName>` token returns the project's full NPM package name including any NPM scope.\n * If there is no associated package.json file, then the value is `unknown-package`.\n *\n * Example: `@scope/my-project`\n */\n packageName: string;\n\n /**\n * The `<projectFolder>` token returns the expanded `\"projectFolder\"` setting from api-extractor.json.\n */\n projectFolder: string;\n}\n\n/**\n * Options for {@link ExtractorConfig.tryLoadForFolder}.\n *\n * @public\n */\nexport interface IExtractorConfigLoadForFolderOptions {\n /**\n * The folder path to start from when searching for api-extractor.json.\n */\n startingFolder: string;\n\n /**\n * An already constructed `PackageJsonLookup` cache object to use. If omitted, a temporary one will\n * be constructed.\n */\n packageJsonLookup?: PackageJsonLookup;\n\n /**\n * An already constructed `RigConfig` object. If omitted, then a new `RigConfig` object will be constructed.\n */\n rigConfig?: RigConfig;\n}\n\n/**\n * Options for {@link ExtractorConfig.prepare}.\n *\n * @public\n */\nexport interface IExtractorConfigPrepareOptions {\n /**\n * A configuration object as returned by {@link ExtractorConfig.loadFile}.\n */\n configObject: IConfigFile;\n\n /**\n * The absolute path of the file that the `configObject` object was loaded from. This is used for error messages\n * and when probing for `tsconfig.json`.\n *\n * @remarks\n *\n * If `configObjectFullPath` and `projectFolderLookupToken` are both unspecified, then the api-extractor.json\n * config file must explicitly specify a `projectFolder` setting rather than relying on the `<lookup>` token.\n */\n configObjectFullPath: string | undefined;\n\n /**\n * The parsed package.json file for the working package, or undefined if API Extractor was invoked without\n * a package.json file.\n *\n * @remarks\n *\n * If omitted, then the `<unscopedPackageName>` and `<packageName>` tokens will have default values.\n */\n packageJson?: INodePackageJson | undefined;\n\n /**\n * The absolute path of the file that the `packageJson` object was loaded from, or undefined if API Extractor\n * was invoked without a package.json file.\n *\n * @remarks\n *\n * This is used for error messages and when resolving paths found in package.json.\n *\n * If `packageJsonFullPath` is specified but `packageJson` is omitted, the file will be loaded automatically.\n */\n packageJsonFullPath: string | undefined;\n\n /**\n * The default value for the `projectFolder` setting is the `<lookup>` token, which uses a heuristic to guess\n * an appropriate project folder. Use `projectFolderLookupValue` to manually specify the `<lookup>` token value\n * instead.\n *\n * @remarks\n * If the `projectFolder` setting is explicitly specified in api-extractor.json file, it should take precedence\n * over a value specified via the API. Thus the `projectFolderLookupToken` option provides a way to override\n * the default value for `projectFolder` setting while still honoring a manually specified value.\n */\n projectFolderLookupToken?: string;\n\n /**\n * Allow customization of the tsdoc.json config file. If omitted, this file will be loaded from its default\n * location. If the file does not exist, then the standard definitions will be used from\n * `@microsoft/api-extractor/extends/tsdoc-base.json`.\n */\n tsdocConfigFile?: TSDocConfigFile;\n\n /**\n * When preparing the configuration object, folder and file paths referenced in the configuration are checked\n * for existence, and an error is reported if they are not found. This option can be used to disable this\n * check for the main entry point module. This may be useful when preparing a configuration file for an\n * un-built project.\n */\n ignoreMissingEntryPoint?: boolean;\n}\n\ninterface IExtractorConfigParameters {\n projectFolder: string;\n packageJson: INodePackageJson | undefined;\n packageFolder: string | undefined;\n mainEntryPointFilePath: string;\n bundledPackages: string[];\n tsconfigFilePath: string;\n overrideTsconfig: {} | undefined;\n skipLibCheck: boolean;\n apiReportEnabled: boolean;\n reportFilePath: string;\n reportTempFilePath: string;\n apiReportIncludeForgottenExports: boolean;\n docModelEnabled: boolean;\n apiJsonFilePath: string;\n docModelIncludeForgottenExports: boolean;\n projectFolderUrl: string | undefined;\n rollupEnabled: boolean;\n untrimmedFilePath: string;\n alphaTrimmedFilePath: string;\n betaTrimmedFilePath: string;\n publicTrimmedFilePath: string;\n omitTrimmingComments: boolean;\n tsdocMetadataEnabled: boolean;\n tsdocMetadataFilePath: string;\n tsdocConfigFile: TSDocConfigFile;\n tsdocConfiguration: TSDocConfiguration;\n newlineKind: NewlineKind;\n messages: IExtractorMessagesConfig;\n testMode: boolean;\n enumMemberOrder: EnumMemberOrder;\n}\n\n/**\n * The `ExtractorConfig` class loads, validates, interprets, and represents the api-extractor.json config file.\n * @public\n */\nexport class ExtractorConfig {\n /**\n * The JSON Schema for API Extractor config file (api-extractor.schema.json).\n */\n public static readonly jsonSchema: JsonSchema = JsonSchema.fromFile(\n path.join(__dirname, '../schemas/api-extractor.schema.json')\n );\n\n /**\n * The config file name \"api-extractor.json\".\n */\n public static readonly FILENAME: 'api-extractor.json' = 'api-extractor.json';\n\n /**\n * The full path to `extends/tsdoc-base.json` which contains the standard TSDoc configuration\n * for API Extractor.\n * @internal\n */\n public static readonly _tsdocBaseFilePath: string = path.resolve(\n __dirname,\n '../../extends/tsdoc-base.json'\n );\n\n private static readonly _defaultConfig: Partial<IConfigFile> = JsonFile.load(\n path.join(__dirname, '../schemas/api-extractor-defaults.json')\n );\n\n private static readonly _declarationFileExtensionRegExp: RegExp = /\\.d\\.ts$/i;\n\n /** {@inheritDoc IConfigFile.projectFolder} */\n public readonly projectFolder: string;\n\n /**\n * The parsed package.json file for the working package, or undefined if API Extractor was invoked without\n * a package.json file.\n */\n public readonly packageJson: INodePackageJson | undefined;\n\n /**\n * The absolute path of the folder containing the package.json file for the working package, or undefined\n * if API Extractor was invoked without a package.json file.\n */\n public readonly packageFolder: string | undefined;\n\n /** {@inheritDoc IConfigFile.mainEntryPointFilePath} */\n public readonly mainEntryPointFilePath: string;\n\n /** {@inheritDoc IConfigFile.bundledPackages} */\n public readonly bundledPackages: string[];\n\n /** {@inheritDoc IConfigCompiler.tsconfigFilePath} */\n public readonly tsconfigFilePath: string;\n\n /** {@inheritDoc IConfigCompiler.overrideTsconfig} */\n public readonly overrideTsconfig: {} | undefined;\n\n /** {@inheritDoc IConfigCompiler.skipLibCheck} */\n public readonly skipLibCheck: boolean;\n\n /** {@inheritDoc IConfigApiReport.enabled} */\n public readonly apiReportEnabled: boolean;\n\n /** The `reportFolder` path combined with the `reportFileName`. */\n public readonly reportFilePath: string;\n /** The `reportTempFolder` path combined with the `reportFileName`. */\n public readonly reportTempFilePath: string;\n /** {@inheritDoc IConfigApiReport.includeForgottenExports} */\n public readonly apiReportIncludeForgottenExports: boolean;\n\n /** {@inheritDoc IConfigDocModel.enabled} */\n public readonly docModelEnabled: boolean;\n /** {@inheritDoc IConfigDocModel.apiJsonFilePath} */\n public readonly apiJsonFilePath: string;\n /** {@inheritDoc IConfigDocModel.includeForgottenExports} */\n public readonly docModelIncludeForgottenExports: boolean;\n /** {@inheritDoc IConfigDocModel.projectFolderUrl} */\n public readonly projectFolderUrl: string | undefined;\n\n /** {@inheritDoc IConfigDtsRollup.enabled} */\n public readonly rollupEnabled: boolean;\n /** {@inheritDoc IConfigDtsRollup.untrimmedFilePath} */\n public readonly untrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.alphaTrimmedFilePath} */\n public readonly alphaTrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.betaTrimmedFilePath} */\n public readonly betaTrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.publicTrimmedFilePath} */\n public readonly publicTrimmedFilePath: string;\n /** {@inheritDoc IConfigDtsRollup.omitTrimmingComments} */\n public readonly omitTrimmingComments: boolean;\n\n /** {@inheritDoc IConfigTsdocMetadata.enabled} */\n public readonly tsdocMetadataEnabled: boolean;\n /** {@inheritDoc IConfigTsdocMetadata.tsdocMetadataFilePath} */\n public readonly tsdocMetadataFilePath: string;\n\n /**\n * The tsdoc.json configuration that will be used when parsing doc comments.\n */\n public readonly tsdocConfigFile: TSDocConfigFile;\n\n /**\n * The `TSDocConfiguration` loaded from {@link ExtractorConfig.tsdocConfigFile}.\n */\n public readonly tsdocConfiguration: TSDocConfiguration;\n\n /**\n * Specifies what type of newlines API Extractor should use when writing output files. By default, the output files\n * will be written with Windows-style newlines.\n */\n public readonly newlineKind: NewlineKind;\n\n /** {@inheritDoc IConfigFile.messages} */\n public readonly messages: IExtractorMessagesConfig;\n\n /** {@inheritDoc IConfigFile.testMode} */\n public readonly testMode: boolean;\n\n /** {@inheritDoc IConfigFile.enumMemberOrder} */\n public readonly enumMemberOrder: EnumMemberOrder;\n\n private constructor(parameters: IExtractorConfigParameters) {\n this.projectFolder = parameters.projectFolder;\n this.packageJson = parameters.packageJson;\n this.packageFolder = parameters.packageFolder;\n this.mainEntryPointFilePath = parameters.mainEntryPointFilePath;\n this.bundledPackages = parameters.bundledPackages;\n this.tsconfigFilePath = parameters.tsconfigFilePath;\n this.overrideTsconfig = parameters.overrideTsconfig;\n this.skipLibCheck = parameters.skipLibCheck;\n this.apiReportEnabled = parameters.apiReportEnabled;\n this.reportFilePath = parameters.reportFilePath;\n this.reportTempFilePath = parameters.reportTempFilePath;\n this.apiReportIncludeForgottenExports = parameters.apiReportIncludeForgottenExports;\n this.docModelEnabled = parameters.docModelEnabled;\n this.apiJsonFilePath = parameters.apiJsonFilePath;\n this.docModelIncludeForgottenExports = parameters.docModelIncludeForgottenExports;\n this.projectFolderUrl = parameters.projectFolderUrl;\n this.rollupEnabled = parameters.rollupEnabled;\n this.untrimmedFilePath = parameters.untrimmedFilePath;\n this.alphaTrimmedFilePath = parameters.alphaTrimmedFilePath;\n this.betaTrimmedFilePath = parameters.betaTrimmedFilePath;\n this.publicTrimmedFilePath = parameters.publicTrimmedFilePath;\n this.omitTrimmingComments = parameters.omitTrimmingComments;\n this.tsdocMetadataEnabled = parameters.tsdocMetadataEnabled;\n this.tsdocMetadataFilePath = parameters.tsdocMetadataFilePath;\n this.tsdocConfigFile = parameters.tsdocConfigFile;\n this.tsdocConfiguration = parameters.tsdocConfiguration;\n this.newlineKind = parameters.newlineKind;\n this.messages = parameters.messages;\n this.testMode = parameters.testMode;\n this.enumMemberOrder = parameters.enumMemberOrder;\n }\n\n /**\n * Returns a JSON-like string representing the `ExtractorConfig` state, which can be printed to a console\n * for diagnostic purposes.\n *\n * @remarks\n * This is used by the \"--diagnostics\" command-line option. The string is not intended to be deserialized;\n * its format may be changed at any time.\n */\n public getDiagnosticDump(): string {\n // Handle the simple JSON-serializable properties using buildJsonDumpObject()\n const result: object = MessageRouter.buildJsonDumpObject(this, {\n keyNamesToOmit: ['tsdocConfigFile', 'tsdocConfiguration']\n });\n\n // Implement custom formatting for tsdocConfigFile and tsdocConfiguration\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (result as any).tsdocConfigFile = {\n filePath: this.tsdocConfigFile.filePath,\n log: this.tsdocConfigFile.log.messages.map((x) => x.toString())\n };\n\n return JSON.stringify(result, undefined, 2);\n }\n\n /**\n * Returns a simplified file path for use in error messages.\n * @internal\n */\n public _getShortFilePath(absolutePath: string): string {\n if (!path.isAbsolute(absolutePath)) {\n throw new InternalError('Expected absolute path: ' + absolutePath);\n }\n if (Path.isUnderOrEqual(absolutePath, this.projectFolder)) {\n return Path.convertToSlashes(path.relative(this.projectFolder, absolutePath));\n }\n return absolutePath;\n }\n\n /**\n * Searches for the api-extractor.json config file associated with the specified starting folder,\n * and loads the file if found. This lookup supports\n * {@link https://www.npmjs.com/package/@rushstack/rig-package | rig packages}.\n *\n * @remarks\n * The search will first look for a package.json file in a parent folder of the starting folder;\n * if found, that will be used as the base folder instead of the starting folder. If the config\n * file is not found in `<baseFolder>/api-extractor.json` or `<baseFolder>/config/api-extractor.json`,\n * then `<baseFolder/config/rig.json` will be checked to see whether a\n * {@link https://www.npmjs.com/package/@rushstack/rig-package | rig package} is referenced; if so then\n * the rig's api-extractor.json file will be used instead. If a config file is found, it will be loaded\n * and returned with the `IExtractorConfigPrepareOptions` object. Otherwise, `undefined` is returned\n * to indicate that API Extractor does not appear to be configured for the specified folder.\n *\n * @returns An options object that can be passed to {@link ExtractorConfig.prepare}, or `undefined`\n * if not api-extractor.json file was found.\n */\n public static tryLoadForFolder(\n options: IExtractorConfigLoadForFolderOptions\n ): IExtractorConfigPrepareOptions | undefined {\n const packageJsonLookup: PackageJsonLookup = options.packageJsonLookup || new PackageJsonLookup();\n const startingFolder: string = options.startingFolder;\n\n // Figure out which project we're in and look for the config file at the project root\n const packageJsonFullPath: string | undefined =\n packageJsonLookup.tryGetPackageJsonFilePathFor(startingFolder);\n const packageFolder: string | undefined = packageJsonFullPath\n ? path.dirname(packageJsonFullPath)\n : undefined;\n\n // If there is no package, then just use the starting folder\n const baseFolder: string = packageFolder || startingFolder;\n\n let projectFolderLookupToken: string | undefined = undefined;\n\n // First try the standard \"config\" subfolder:\n let configFilename: string = path.join(baseFolder, 'config', ExtractorConfig.FILENAME);\n if (FileSystem.exists(configFilename)) {\n if (FileSystem.exists(path.join(baseFolder, ExtractorConfig.FILENAME))) {\n throw new Error(`Found conflicting ${ExtractorConfig.FILENAME} files in \".\" and \"./config\" folders`);\n }\n } else {\n // Otherwise try the top-level folder\n configFilename = path.join(baseFolder, ExtractorConfig.FILENAME);\n\n if (!FileSystem.exists(configFilename)) {\n // If We didn't find it in <packageFolder>/api-extractor.json or <packageFolder>/config/api-extractor.json\n // then check for a rig package\n if (packageFolder) {\n let rigConfig: RigConfig;\n if (options.rigConfig) {\n // The caller provided an already solved RigConfig. Double-check that it is for the right project.\n if (!Path.isEqual(options.rigConfig.projectFolderPath, packageFolder)) {\n throw new Error(\n 'The provided ILoadForFolderOptions.rigConfig is for the wrong project folder:\\n' +\n '\\nExpected path: ' +\n packageFolder +\n '\\nProvided path: ' +\n options.rigConfig.projectFolderOriginalPath\n );\n }\n rigConfig = options.rigConfig;\n } else {\n rigConfig = RigConfig.loadForProjectFolder({\n projectFolderPath: packageFolder\n });\n }\n\n if (rigConfig.rigFound) {\n configFilename = path.join(rigConfig.getResolvedProfileFolder(), ExtractorConfig.FILENAME);\n\n // If the \"projectFolder\" setting isn't specified in api-extractor.json, it defaults to the\n // \"<lookup>\" token which will probe for the tsconfig.json nearest to the api-extractor.json path.\n // But this won't work if api-extractor.json belongs to the rig. So instead \"<lookup>\" should be\n // the \"<packageFolder>\" that referenced the rig.\n projectFolderLookupToken = packageFolder;\n }\n }\n if (!FileSystem.exists(configFilename)) {\n // API Extractor does not seem to be configured for this folder\n return undefined;\n }\n }\n }\n\n const configObjectFullPath: string = path.resolve(configFilename);\n const configObject: IConfigFile = ExtractorConfig.loadFile(configObjectFullPath);\n\n return {\n configObject,\n configObjectFullPath,\n packageJsonFullPath,\n projectFolderLookupToken\n };\n }\n\n /**\n * Loads the api-extractor.json config file from the specified file path, and prepares an `ExtractorConfig` object.\n *\n * @remarks\n * Loads the api-extractor.json config file from the specified file path. If the \"extends\" field is present,\n * the referenced file(s) will be merged. For any omitted fields, the API Extractor default values are merged.\n *\n * The result is prepared using `ExtractorConfig.prepare()`.\n */\n public static loadFileAndPrepare(configJsonFilePath: string): ExtractorConfig {\n const configObjectFullPath: string = path.resolve(configJsonFilePath);\n const configObject: IConfigFile = ExtractorConfig.loadFile(configObjectFullPath);\n\n const packageJsonLookup: PackageJsonLookup = new PackageJsonLookup();\n const packageJsonFullPath: string | undefined =\n packageJsonLookup.tryGetPackageJsonFilePathFor(configObjectFullPath);\n\n const extractorConfig: ExtractorConfig = ExtractorConfig.prepare({\n configObject,\n configObjectFullPath,\n packageJsonFullPath\n });\n\n return extractorConfig;\n }\n\n /**\n * Performs only the first half of {@link ExtractorConfig.loadFileAndPrepare}, providing an opportunity to\n * modify the object before it is passed to {@link ExtractorConfig.prepare}.\n *\n * @remarks\n * Loads the api-extractor.json config file from the specified file path. If the \"extends\" field is present,\n * the referenced file(s) will be merged. For any omitted fields, the API Extractor default values are merged.\n */\n public static loadFile(jsonFilePath: string): IConfigFile {\n // Set to keep track of config files which have been processed.\n const visitedPaths: Set<string> = new Set<string>();\n\n let currentConfigFilePath: string = path.resolve(jsonFilePath);\n let configObject: Partial<IConfigFile> = {};\n\n try {\n do {\n // Check if this file was already processed.\n if (visitedPaths.has(currentConfigFilePath)) {\n throw new Error(\n `The API Extractor \"extends\" setting contains a cycle.` +\n ` This file is included twice: \"${currentConfigFilePath}\"`\n );\n }\n visitedPaths.add(currentConfigFilePath);\n\n const currentConfigFolderPath: string = path.dirname(currentConfigFilePath);\n\n // Load the extractor config defined in extends property.\n const baseConfig: IConfigFile = JsonFile.load(currentConfigFilePath);\n\n let extendsField: string = baseConfig.extends || '';\n\n // Delete the \"extends\" field so it doesn't get merged\n delete baseConfig.extends;\n\n if (extendsField) {\n if (extendsField.match(/^\\.\\.?[\\\\/]/)) {\n // EXAMPLE: \"./subfolder/api-extractor-base.json\"\n extendsField = path.resolve(currentConfigFolderPath, extendsField);\n } else {\n // EXAMPLE: \"my-package/api-extractor-base.json\"\n //\n // Resolve \"my-package\" from the perspective of the current folder.\n try {\n extendsField = resolve.sync(extendsField, {\n basedir: currentConfigFolderPath\n });\n } catch (e) {\n throw new Error(`Error resolving NodeJS path \"${extendsField}\": ${(e as Error).message}`);\n }\n }\n }\n\n // This step has to be performed in advance, since the currentConfigFolderPath information will be lost\n // after lodash.merge() is performed.\n ExtractorConfig._resolveConfigFileRelativePaths(baseConfig, currentConfigFolderPath);\n\n // Merge extractorConfig into baseConfig, mutating baseConfig\n lodash.merge(baseConfig, configObject);\n configObject = baseConfig;\n\n currentConfigFilePath = extendsField;\n } while (currentConfigFilePath);\n } catch (e) {\n throw new Error(`Error loading ${currentConfigFilePath}:\\n` + (e as Error).message);\n }\n\n // Lastly, apply the defaults\n configObject = lodash.merge(lodash.cloneDeep(ExtractorConfig._defaultConfig), configObject);\n\n ExtractorConfig.jsonSchema.validateObject(configObject, jsonFilePath);\n\n // The schema validation should ensure that this object conforms to IConfigFile\n return configObject as IConfigFile;\n }\n\n private static _resolveConfigFileRelativePaths(\n configFile: IConfigFile,\n currentConfigFolderPath: string\n ): void {\n if (configFile.projectFolder) {\n configFile.projectFolder = ExtractorConfig._resolveConfigFileRelativePath(\n 'projectFolder',\n configFile.projectFolder,\n currentConfigFolderPath\n );\n }\n\n if (configFile.mainEntryPointFilePath) {\n configFile.mainEntryPointFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'mainEntryPointFilePath',\n configFile.mainEntryPointFilePath,\n currentConfigFolderPath\n );\n }\n\n if (configFile.compiler) {\n if (configFile.compiler.tsconfigFilePath) {\n configFile.compiler.tsconfigFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'tsconfigFilePath',\n configFile.compiler.tsconfigFilePath,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.apiReport) {\n if (configFile.apiReport.reportFolder) {\n configFile.apiReport.reportFolder = ExtractorConfig._resolveConfigFileRelativePath(\n 'reportFolder',\n configFile.apiReport.reportFolder,\n currentConfigFolderPath\n );\n }\n if (configFile.apiReport.reportTempFolder) {\n configFile.apiReport.reportTempFolder = ExtractorConfig._resolveConfigFileRelativePath(\n 'reportTempFolder',\n configFile.apiReport.reportTempFolder,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.docModel) {\n if (configFile.docModel.apiJsonFilePath) {\n configFile.docModel.apiJsonFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'apiJsonFilePath',\n configFile.docModel.apiJsonFilePath,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.dtsRollup) {\n if (configFile.dtsRollup.untrimmedFilePath) {\n configFile.dtsRollup.untrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'untrimmedFilePath',\n configFile.dtsRollup.untrimmedFilePath,\n currentConfigFolderPath\n );\n }\n if (configFile.dtsRollup.alphaTrimmedFilePath) {\n configFile.dtsRollup.alphaTrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'alphaTrimmedFilePath',\n configFile.dtsRollup.alphaTrimmedFilePath,\n currentConfigFolderPath\n );\n }\n if (configFile.dtsRollup.betaTrimmedFilePath) {\n configFile.dtsRollup.betaTrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'betaTrimmedFilePath',\n configFile.dtsRollup.betaTrimmedFilePath,\n currentConfigFolderPath\n );\n }\n if (configFile.dtsRollup.publicTrimmedFilePath) {\n configFile.dtsRollup.publicTrimmedFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'publicTrimmedFilePath',\n configFile.dtsRollup.publicTrimmedFilePath,\n currentConfigFolderPath\n );\n }\n }\n\n if (configFile.tsdocMetadata) {\n if (configFile.tsdocMetadata.tsdocMetadataFilePath) {\n configFile.tsdocMetadata.tsdocMetadataFilePath = ExtractorConfig._resolveConfigFileRelativePath(\n 'tsdocMetadataFilePath',\n configFile.tsdocMetadata.tsdocMetadataFilePath,\n currentConfigFolderPath\n );\n }\n }\n }\n\n private static _resolveConfigFileRelativePath(\n fieldName: string,\n fieldValue: string,\n currentConfigFolderPath: string\n ): string {\n if (!path.isAbsolute(fieldValue)) {\n if (fieldValue.indexOf('<projectFolder>') !== 0) {\n // If the path is not absolute and does not start with \"<projectFolder>\", then resolve it relative\n // to the folder of the config file that it appears in\n return path.join(currentConfigFolderPath, fieldValue);\n }\n }\n\n return fieldValue;\n }\n\n /**\n * Prepares an `ExtractorConfig` object using a configuration that is provided as a runtime object,\n * rather than reading it from disk. This allows configurations to be constructed programmatically,\n * loaded from an alternate source, and/or customized after loading.\n */\n public static prepare(options: IExtractorConfigPrepareOptions): ExtractorConfig {\n const filenameForErrors: string = options.configObjectFullPath || 'the configuration object';\n const configObject: Partial<IConfigFile> = options.configObject;\n\n if (configObject.extends) {\n throw new Error(\n 'The IConfigFile.extends field must be expanded before calling ExtractorConfig.prepare()'\n );\n }\n\n if (options.configObjectFullPath) {\n if (!path.isAbsolute(options.configObjectFullPath)) {\n throw new Error('The \"configObjectFullPath\" setting must be an absolute path');\n }\n }\n\n ExtractorConfig.jsonSchema.validateObject(configObject, filenameForErrors);\n\n const packageJsonFullPath: string | undefined = options.packageJsonFullPath;\n let packageFolder: string | undefined = undefined;\n let packageJson: INodePackageJson | undefined = undefined;\n\n if (packageJsonFullPath) {\n if (!/.json$/i.test(packageJsonFullPath)) {\n // Catch common mistakes e.g. where someone passes a folder path instead of a file path\n throw new Error('The \"packageJsonFullPath\" setting does not have a .json file extension');\n }\n if (!path.isAbsolute(packageJsonFullPath)) {\n throw new Error('The \"packageJsonFullPath\" setting must be an absolute path');\n }\n\n if (options.packageJson) {\n packageJson = options.packageJson;\n } else {\n const packageJsonLookup: PackageJsonLookup = new PackageJsonLookup();\n packageJson = packageJsonLookup.loadNodePackageJson(packageJsonFullPath);\n }\n\n packageFolder = path.dirname(packageJsonFullPath);\n }\n\n // \"tsdocConfigFile\" and \"tsdocConfiguration\" are prepared outside the try-catch block,\n // so that if exceptions are thrown, it will not get the \"Error parsing api-extractor.json:\" header\n let extractorConfigParameters: Omit<IExtractorConfigParameters, 'tsdocConfigFile' | 'tsdocConfiguration'>;\n\n try {\n if (!configObject.compiler) {\n // A merged configuration should have this\n throw new Error('The \"compiler\" section is missing');\n }\n\n if (!configObject.projectFolder) {\n // A merged configuration should have this\n throw new Error('The \"projectFolder\" setting is missing');\n }\n\n let projectFolder: string;\n if (configObject.projectFolder.trim() === '<lookup>') {\n if (options.projectFolderLookupToken) {\n // Use the manually specified \"<lookup>\" value\n projectFolder = options.projectFolderLookupToken;\n\n if (!FileSystem.exists(options.projectFolderLookupToken)) {\n throw new Error(\n 'The specified \"projectFolderLookupToken\" path does not exist: ' +\n options.projectFolderLookupToken\n );\n }\n } else {\n if (!options.configObjectFullPath) {\n throw new Error(\n 'The \"projectFolder\" setting uses the \"<lookup>\" token, but it cannot be expanded because' +\n ' the \"configObjectFullPath\" setting was not specified'\n );\n }\n\n // \"The default value for `projectFolder` is the token `<lookup>`, which means the folder is determined\n // by traversing parent folders, starting from the folder containing api-extractor.json, and stopping\n // at the first folder that contains a tsconfig.json file. If a tsconfig.json file cannot be found in\n // this way, then an error will be reported.\"\n\n let currentFolder: string = path.dirname(options.configObjectFullPath);\n for (;;) {\n const tsconfigPath: string = path.join(currentFolder, 'tsconfig.json');\n if (FileSystem.exists(tsconfigPath)) {\n projectFolder = currentFolder;\n break;\n }\n const parentFolder: string = path.dirname(currentFolder);\n if (parentFolder === '' || parentFolder === currentFolder) {\n throw new Error(\n 'The \"projectFolder\" setting uses the \"<lookup>\" token, but a tsconfig.json file cannot be' +\n ' found in this folder or any parent folder.'\n );\n }\n currentFolder = parentFolder;\n }\n }\n } else {\n ExtractorConfig._rejectAnyTokensInPath(configObject.projectFolder, 'projectFolder');\n\n if (!FileSystem.exists(configObject.projectFolder)) {\n throw new Error('The specified \"projectFolder\" path does not exist: ' + configObject.projectFolder);\n }\n\n projectFolder = configObject.projectFolder;\n }\n\n const tokenContext: IExtractorConfigTokenContext = {\n unscopedPackageName: 'unknown-package',\n packageName: 'unknown-package',\n projectFolder: projectFolder\n };\n\n if (packageJson) {\n tokenContext.packageName = packageJson.name;\n tokenContext.unscopedPackageName = PackageName.getUnscopedName(packageJson.name);\n }\n\n if (!configObject.mainEntryPointFilePath) {\n // A merged configuration should have this\n throw new Error('The \"mainEntryPointFilePath\" setting is missing');\n }\n const mainEntryPointFilePath: string = ExtractorConfig._resolvePathWithTokens(\n 'mainEntryPointFilePath',\n configObject.mainEntryPointFilePath,\n tokenContext\n );\n\n if (!ExtractorConfig.hasDtsFileExtension(mainEntryPointFilePath)) {\n throw new Error(\n 'The \"mainEntryPointFilePath\" value is not a declaration file: ' + mainEntryPointFilePath\n );\n }\n\n if (!options.ignoreMissingEntryPoint && !FileSystem.exists(mainEntryPointFilePath)) {\n throw new Error('The \"mainEntryPointFilePath\" path does not exist: ' + mainEntryPointFilePath);\n }\n\n const bundledPackages: string[] = configObject.bundledPackages || [];\n for (const bundledPackage of bundledPackages) {\n if (!PackageName.isValidName(bundledPackage)) {\n throw new Error(`The \"bundledPackages\" list contains an invalid package name: \"${bundledPackage}\"`);\n }\n }\n\n const tsconfigFilePath: string = ExtractorConfig._resolvePathWithTokens(\n 'tsconfigFilePath',\n configObject.compiler.tsconfigFilePath,\n tokenContext\n );\n\n if (configObject.compiler.overrideTsconfig === undefined) {\n if (!tsconfigFilePath) {\n throw new Error('Either the \"tsconfigFilePath\" or \"overrideTsconfig\" setting must be specified');\n }\n if (!FileSystem.exists(tsconfigFilePath)) {\n throw new Error('The file referenced by \"tsconfigFilePath\" does not exist: ' + tsconfigFilePath);\n }\n }\n\n let apiReportEnabled: boolean = false;\n let reportFilePath: string = '';\n let reportTempFilePath: string = '';\n let apiReportIncludeForgottenExports: boolean = false;\n if (configObject.apiReport) {\n apiReportEnabled = !!configObject.apiReport.enabled;\n\n const reportFilename: string = ExtractorConfig._expandStringWithTokens(\n 'reportFileName',\n configObject.apiReport.reportFileName || '',\n tokenContext\n );\n\n if (!reportFilename) {\n // A merged configuration should have this\n throw new Error('The \"reportFilename\" setting is missing');\n }\n if (reportFilename.indexOf('/') >= 0 || reportFilename.indexOf('\\\\') >= 0) {\n // A merged configuration should have this\n throw new Error(`The \"reportFilename\" setting contains invalid characters: \"${reportFilename}\"`);\n }\n\n const reportFolder: string = ExtractorConfig._resolvePathWithTokens(\n 'reportFolder',\n configObject.apiReport.reportFolder,\n tokenContext\n );\n const reportTempFolder: string = ExtractorConfig._resolvePathWithTokens(\n 'reportTempFolder',\n configObject.apiReport.reportTempFolder,\n tokenContext\n );\n\n reportFilePath = path.join(reportFolder, reportFilename);\n reportTempFilePath = path.join(reportTempFolder, reportFilename);\n apiReportIncludeForgottenExports = !!configObject.apiReport.includeForgottenExports;\n }\n\n let docModelEnabled: boolean = false;\n let apiJsonFilePath: string = '';\n let docModelIncludeForgottenExports: boolean = false;\n let projectFolderUrl: string | undefined;\n if (configObject.docModel) {\n docModelEnabled = !!configObject.docModel.enabled;\n apiJsonFilePath = ExtractorConfig._resolvePathWithTokens(\n 'apiJsonFilePath',\n configObject.docModel.apiJsonFilePath,\n tokenContext\n );\n docModelIncludeForgottenExports = !!configObject.docModel.includeForgottenExports;\n projectFolderUrl = configObject.docModel.projectFolderUrl;\n }\n\n let tsdocMetadataEnabled: boolean = false;\n let tsdocMetadataFilePath: string = '';\n if (configObject.tsdocMetadata) {\n tsdocMetadataEnabled = !!configObject.tsdocMetadata.enabled;\n\n if (tsdocMetadataEnabled) {\n tsdocMetadataFilePath = configObject.tsdocMetadata.tsdocMetadataFilePath || '';\n\n if (tsdocMetadataFilePath.trim() === '<lookup>') {\n if (!packageJson) {\n throw new Error(\n 'The \"<lookup>\" token cannot be used with the \"tsdocMetadataFilePath\" setting because' +\n ' the \"packageJson\" option was not provided'\n );\n }\n if (!packageJsonFullPath) {\n throw new Error(\n 'The \"<lookup>\" token cannot be used with \"tsdocMetadataFilePath\" because' +\n 'the \"packageJsonFullPath\" option was not provided'\n );\n }\n tsdocMetadataFilePath = PackageMetadataManager.resolveTsdocMetadataPath(\n path.dirname(packageJsonFullPath),\n packageJson\n );\n } else {\n tsdocMetadataFilePath = ExtractorConfig._resolvePathWithTokens(\n 'tsdocMetadataFilePath',\n configObject.tsdocMetadata.tsdocMetadataFilePath,\n tokenContext\n );\n }\n\n if (!tsdocMetadataFilePath) {\n throw new Error(\n 'The \"tsdocMetadata.enabled\" setting is enabled,' +\n ' but \"tsdocMetadataFilePath\" is not specified'\n );\n }\n }\n }\n\n let rollupEnabled: boolean = false;\n let untrimmedFilePath: string = '';\n let betaTrimmedFilePath: string = '';\n let alphaTrimmedFilePath: string = '';\n let publicTrimmedFilePath: string = '';\n let omitTrimmingComments: boolean = false;\n\n if (configObject.dtsRollup) {\n rollupEnabled = !!configObject.dtsRollup.enabled;\n untrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'untrimmedFilePath',\n configObject.dtsRollup.untrimmedFilePath,\n tokenContext\n );\n alphaTrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'alphaTrimmedFilePath',\n configObject.dtsRollup.alphaTrimmedFilePath,\n tokenContext\n );\n betaTrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'betaTrimmedFilePath',\n configObject.dtsRollup.betaTrimmedFilePath,\n tokenContext\n );\n publicTrimmedFilePath = ExtractorConfig._resolvePathWithTokens(\n 'publicTrimmedFilePath',\n configObject.dtsRollup.publicTrimmedFilePath,\n tokenContext\n );\n omitTrimmingComments = !!configObject.dtsRollup.omitTrimmingComments;\n }\n\n let newlineKind: NewlineKind;\n switch (configObject.newlineKind) {\n case 'lf':\n newlineKind = NewlineKind.Lf;\n break;\n case 'os':\n newlineKind = NewlineKind.OsDefault;\n break;\n default:\n newlineKind = NewlineKind.CrLf;\n break;\n }\n\n const enumMemberOrder: EnumMemberOrder = configObject.enumMemberOrder ?? EnumMemberOrder.ByName;\n\n extractorConfigParameters = {\n projectFolder: projectFolder,\n packageJson,\n packageFolder,\n mainEntryPointFilePath,\n bundledPackages,\n tsconfigFilePath,\n overrideTsconfig: configObject.compiler.overrideTsconfig,\n skipLibCheck: !!configObject.compiler.skipLibCheck,\n apiReportEnabled,\n reportFilePath,\n reportTempFilePath,\n apiReportIncludeForgottenExports,\n docModelEnabled,\n apiJsonFilePath,\n docModelIncludeForgottenExports,\n projectFolderUrl,\n rollupEnabled,\n untrimmedFilePath,\n alphaTrimmedFilePath,\n betaTrimmedFilePath,\n publicTrimmedFilePath,\n omitTrimmingComments,\n tsdocMetadataEnabled,\n tsdocMetadataFilePath,\n newlineKind,\n messages: configObject.messages || {},\n testMode: !!configObject.testMode,\n enumMemberOrder\n };\n } catch (e) {\n throw new Error(`Error parsing ${filenameForErrors}:\\n` + (e as Error).message);\n }\n\n let tsdocConfigFile: TSDocConfigFile | undefined = options.tsdocConfigFile;\n\n if (!tsdocConfigFile) {\n // Example: \"my-project/tsdoc.json\"\n let packageTSDocConfigPath: string = TSDocConfigFile.findConfigPathForFolder(\n extractorConfigParameters.projectFolder\n );\n\n if (!packageTSDocConfigPath || !FileSystem.exists(packageTSDocConfigPath)) {\n // If the project does not have a tsdoc.json config file, then use API Extractor's base file.\n packageTSDocConfigPath = ExtractorConfig._tsdocBaseFilePath;\n if (!FileSystem.exists(packageTSDocConfigPath)) {\n throw new InternalError('Unable to load the built-in TSDoc config file: ' + packageTSDocConfigPath);\n }\n }\n tsdocConfigFile = TSDocConfigFile.loadFile(packageTSDocConfigPath);\n }\n\n // IMPORTANT: After calling TSDocConfigFile.loadFile(), we need to check for errors.\n if (tsdocConfigFile.hasErrors) {\n throw new Error(tsdocConfigFile.getErrorSummary());\n }\n\n const tsdocConfiguration: TSDocConfiguration = new TSDocConfiguration();\n tsdocConfigFile.configureParser(tsdocConfiguration);\n\n // IMPORTANT: After calling TSDocConfigFile.configureParser(), we need to check for errors a second time.\n if (tsdocConfigFile.hasErrors) {\n throw new Error(tsdocConfigFile.getErrorSummary());\n }\n\n return new ExtractorConfig({ ...extractorConfigParameters, tsdocConfigFile, tsdocConfiguration });\n }\n\n private static _resolvePathWithTokens(\n fieldName: string,\n value: string | undefined,\n tokenContext: IExtractorConfigTokenContext\n ): string {\n value = ExtractorConfig._expandStringWithTokens(fieldName, value, tokenContext);\n if (value !== '') {\n value = path.resolve(tokenContext.projectFolder, value);\n }\n return value;\n }\n\n private static _expandStringWithTokens(\n fieldName: string,\n value: string | undefined,\n tokenContext: IExtractorConfigTokenContext\n ): string {\n value = value ? value.trim() : '';\n if (value !== '') {\n value = Text.replaceAll(value, '<unscopedPackageName>', tokenContext.unscopedPackageName);\n value = Text.replaceAll(value, '<packageName>', tokenContext.packageName);\n\n const projectFolderToken: string = '<projectFolder>';\n if (value.indexOf(projectFolderToken) === 0) {\n // Replace \"<projectFolder>\" at the start of a string\n value = path.join(tokenContext.projectFolder, value.substr(projectFolderToken.length));\n }\n\n if (value.indexOf(projectFolderToken) >= 0) {\n // If after all replacements, \"<projectFolder>\" appears somewhere in the string, report an error\n throw new Error(\n `The \"${fieldName}\" value incorrectly uses the \"<projectFolder>\" token.` +\n ` It must appear at the start of the string.`\n );\n }\n\n if (value.indexOf('<lookup>') >= 0) {\n throw new Error(`The \"${fieldName}\" value incorrectly uses the \"<lookup>\" token`);\n }\n ExtractorConfig._rejectAnyTokensInPath(value, fieldName);\n }\n return value;\n }\n\n /**\n * Returns true if the specified file path has the \".d.ts\" file extension.\n */\n public static hasDtsFileExtension(filePath: string): boolean {\n return ExtractorConfig._declarationFileExtensionRegExp.test(filePath);\n }\n\n /**\n * Given a path string that may have originally contained expandable tokens such as `<projectFolder>\"`\n * this reports an error if any token-looking substrings remain after expansion (e.g. `c:\\blah\\<invalid>\\blah`).\n */\n private static _rejectAnyTokensInPath(value: string, fieldName: string): void {\n if (value.indexOf('<') < 0 && value.indexOf('>') < 0) {\n return;\n }\n\n // Can we determine the name of a token?\n const tokenRegExp: RegExp = /(\\<[^<]*?\\>)/;\n const match: RegExpExecArray | null = tokenRegExp.exec(value);\n if (match) {\n throw new Error(`The \"${fieldName}\" value contains an unrecognized token \"${match[1]}\"`);\n }\n throw new Error(`The \"${fieldName}\" value contains extra token characters (\"<\" or \">\"): ${value}`);\n }\n}\n"]}
@@ -499,6 +499,6 @@ class MessageRouter {
499
499
  });
500
500
  }
501
501
  }
502
- exports.MessageRouter = MessageRouter;
503
502
  MessageRouter.DIAGNOSTICS_LINE = '============================================================';
503
+ exports.MessageRouter = MessageRouter;
504
504
  //# sourceMappingURL=MessageRouter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageRouter.js","sourceRoot":"","sources":["../../src/collector/MessageRouter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport colors from 'colors';\nimport * as ts from 'typescript';\nimport * as tsdoc from '@microsoft/tsdoc';\nimport { Sort, InternalError } from '@rushstack/node-core-library';\n\nimport { AstDeclaration } from '../analyzer/AstDeclaration';\nimport { AstSymbol } from '../analyzer/AstSymbol';\nimport {\n ExtractorMessage,\n ExtractorMessageCategory,\n IExtractorMessageOptions,\n IExtractorMessageProperties\n} from '../api/ExtractorMessage';\nimport { ExtractorMessageId, allExtractorMessageIds } from '../api/ExtractorMessageId';\nimport { IExtractorMessagesConfig, IConfigMessageReportingRule } from '../api/IConfigFile';\nimport { ISourceLocation, SourceMapper } from './SourceMapper';\nimport { ExtractorLogLevel } from '../api/ExtractorLogLevel';\nimport { ConsoleMessageId } from '../api/ConsoleMessageId';\n\ninterface IReportingRule {\n logLevel: ExtractorLogLevel;\n addToApiReportFile: boolean;\n}\n\nexport interface IMessageRouterOptions {\n workingPackageFolder: string | undefined;\n messageCallback: ((message: ExtractorMessage) => void) | undefined;\n messagesConfig: IExtractorMessagesConfig;\n showVerboseMessages: boolean;\n showDiagnostics: boolean;\n tsdocConfiguration: tsdoc.TSDocConfiguration;\n sourceMapper: SourceMapper;\n}\n\nexport interface IBuildJsonDumpObjectOptions {\n /**\n * {@link MessageRouter.buildJsonDumpObject} will omit any objects keys with these names.\n */\n keyNamesToOmit?: string[];\n}\n\nexport class MessageRouter {\n public static readonly DIAGNOSTICS_LINE: string =\n '============================================================';\n\n private readonly _workingPackageFolder: string | undefined;\n private readonly _messageCallback: ((message: ExtractorMessage) => void) | undefined;\n\n // All messages\n private readonly _messages: ExtractorMessage[];\n\n // For each AstDeclaration, the messages associated with it. This is used when addToApiReportFile=true\n private readonly _associatedMessagesForAstDeclaration: Map<AstDeclaration, ExtractorMessage[]>;\n\n private readonly _sourceMapper: SourceMapper;\n\n private readonly _tsdocConfiguration: tsdoc.TSDocConfiguration;\n\n // Normalized representation of the routing rules from api-extractor.json\n private _reportingRuleByMessageId: Map<string, IReportingRule> = new Map<string, IReportingRule>();\n private _compilerDefaultRule: IReportingRule = {\n logLevel: ExtractorLogLevel.None,\n addToApiReportFile: false\n };\n private _extractorDefaultRule: IReportingRule = {\n logLevel: ExtractorLogLevel.None,\n addToApiReportFile: false\n };\n private _tsdocDefaultRule: IReportingRule = { logLevel: ExtractorLogLevel.None, addToApiReportFile: false };\n\n public errorCount: number = 0;\n public warningCount: number = 0;\n\n /**\n * See {@link IExtractorInvokeOptions.showVerboseMessages}\n */\n public readonly showVerboseMessages: boolean;\n\n /**\n * See {@link IExtractorInvokeOptions.showDiagnostics}\n */\n public readonly showDiagnostics: boolean;\n\n public constructor(options: IMessageRouterOptions) {\n this._workingPackageFolder = options.workingPackageFolder;\n this._messageCallback = options.messageCallback;\n\n this._messages = [];\n this._associatedMessagesForAstDeclaration = new Map<AstDeclaration, ExtractorMessage[]>();\n this._sourceMapper = options.sourceMapper;\n this._tsdocConfiguration = options.tsdocConfiguration;\n\n // showDiagnostics implies showVerboseMessages\n this.showVerboseMessages = options.showVerboseMessages || options.showDiagnostics;\n this.showDiagnostics = options.showDiagnostics;\n\n this._applyMessagesConfig(options.messagesConfig);\n }\n\n /**\n * Read the api-extractor.json configuration and build up the tables of routing rules.\n */\n private _applyMessagesConfig(messagesConfig: IExtractorMessagesConfig): void {\n if (messagesConfig.compilerMessageReporting) {\n for (const messageId of Object.getOwnPropertyNames(messagesConfig.compilerMessageReporting)) {\n const reportingRule: IReportingRule = MessageRouter._getNormalizedRule(\n messagesConfig.compilerMessageReporting[messageId]\n );\n\n if (messageId === 'default') {\n this._compilerDefaultRule = reportingRule;\n } else if (!/^TS[0-9]+$/.test(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.compilerMessageReporting table contains` +\n ` an invalid entry \"${messageId}\". The identifier format is \"TS\" followed by an integer.`\n );\n } else {\n this._reportingRuleByMessageId.set(messageId, reportingRule);\n }\n }\n }\n\n if (messagesConfig.extractorMessageReporting) {\n for (const messageId of Object.getOwnPropertyNames(messagesConfig.extractorMessageReporting)) {\n const reportingRule: IReportingRule = MessageRouter._getNormalizedRule(\n messagesConfig.extractorMessageReporting[messageId]\n );\n\n if (messageId === 'default') {\n this._extractorDefaultRule = reportingRule;\n } else if (!/^ae-/.test(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.extractorMessageReporting table contains` +\n ` an invalid entry \"${messageId}\". The name should begin with the \"ae-\" prefix.`\n );\n } else if (!allExtractorMessageIds.has(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.extractorMessageReporting table contains` +\n ` an unrecognized identifier \"${messageId}\". Is it spelled correctly?`\n );\n } else {\n this._reportingRuleByMessageId.set(messageId, reportingRule);\n }\n }\n }\n\n if (messagesConfig.tsdocMessageReporting) {\n for (const messageId of Object.getOwnPropertyNames(messagesConfig.tsdocMessageReporting)) {\n const reportingRule: IReportingRule = MessageRouter._getNormalizedRule(\n messagesConfig.tsdocMessageReporting[messageId]\n );\n\n if (messageId === 'default') {\n this._tsdocDefaultRule = reportingRule;\n } else if (!/^tsdoc-/.test(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.tsdocMessageReporting table contains` +\n ` an invalid entry \"${messageId}\". The name should begin with the \"tsdoc-\" prefix.`\n );\n } else if (!this._tsdocConfiguration.isKnownMessageId(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.tsdocMessageReporting table contains` +\n ` an unrecognized identifier \"${messageId}\". Is it spelled correctly?`\n );\n } else {\n this._reportingRuleByMessageId.set(messageId, reportingRule);\n }\n }\n }\n }\n\n private static _getNormalizedRule(rule: IConfigMessageReportingRule): IReportingRule {\n return {\n logLevel: rule.logLevel || 'none',\n addToApiReportFile: rule.addToApiReportFile || false\n };\n }\n\n public get messages(): ReadonlyArray<ExtractorMessage> {\n return this._messages;\n }\n\n /**\n * Add a diagnostic message reported by the TypeScript compiler\n */\n public addCompilerDiagnostic(diagnostic: ts.Diagnostic): void {\n switch (diagnostic.category) {\n case ts.DiagnosticCategory.Suggestion:\n case ts.DiagnosticCategory.Message:\n return; // ignore noise\n }\n\n const messageText: string = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n const options: IExtractorMessageOptions = {\n category: ExtractorMessageCategory.Compiler,\n messageId: `TS${diagnostic.code}`,\n text: messageText\n };\n\n if (diagnostic.file) {\n // NOTE: Since compiler errors pertain to issues specific to the .d.ts files,\n // we do not apply source mappings for them.\n const sourceFile: ts.SourceFile = diagnostic.file;\n const sourceLocation: ISourceLocation = this._sourceMapper.getSourceLocation({\n sourceFile,\n pos: diagnostic.start || 0,\n useDtsLocation: true\n });\n options.sourceFilePath = sourceLocation.sourceFilePath;\n options.sourceFileLine = sourceLocation.sourceFileLine;\n options.sourceFileColumn = sourceLocation.sourceFileColumn;\n }\n\n this._messages.push(new ExtractorMessage(options));\n }\n\n /**\n * Add a message from the API Extractor analysis\n */\n public addAnalyzerIssue(\n messageId: ExtractorMessageId,\n messageText: string,\n astDeclarationOrSymbol: AstDeclaration | AstSymbol,\n properties?: IExtractorMessageProperties\n ): void {\n let astDeclaration: AstDeclaration;\n if (astDeclarationOrSymbol instanceof AstDeclaration) {\n astDeclaration = astDeclarationOrSymbol;\n } else {\n astDeclaration = astDeclarationOrSymbol.astDeclarations[0];\n }\n\n const extractorMessage: ExtractorMessage = this.addAnalyzerIssueForPosition(\n messageId,\n messageText,\n astDeclaration.declaration.getSourceFile(),\n astDeclaration.declaration.getStart(),\n properties\n );\n\n this._associateMessageWithAstDeclaration(extractorMessage, astDeclaration);\n }\n\n /**\n * Add all messages produced from an invocation of the TSDoc parser, assuming they refer to\n * code in the specified source file.\n */\n public addTsdocMessages(\n parserContext: tsdoc.ParserContext,\n sourceFile: ts.SourceFile,\n astDeclaration?: AstDeclaration\n ): void {\n for (const message of parserContext.log.messages) {\n const options: IExtractorMessageOptions = {\n category: ExtractorMessageCategory.TSDoc,\n messageId: message.messageId,\n text: message.unformattedText\n };\n\n const sourceLocation: ISourceLocation = this._sourceMapper.getSourceLocation({\n sourceFile,\n pos: message.textRange.pos\n });\n options.sourceFilePath = sourceLocation.sourceFilePath;\n options.sourceFileLine = sourceLocation.sourceFileLine;\n options.sourceFileColumn = sourceLocation.sourceFileColumn;\n\n const extractorMessage: ExtractorMessage = new ExtractorMessage(options);\n\n if (astDeclaration) {\n this._associateMessageWithAstDeclaration(extractorMessage, astDeclaration);\n }\n\n this._messages.push(extractorMessage);\n }\n }\n\n /**\n * Recursively collects the primitive members (numbers, strings, arrays, etc) into an object that\n * is JSON serializable. This is used by the \"--diagnostics\" feature to dump the state of configuration objects.\n *\n * @returns a JSON serializable object (possibly including `null` values)\n * or `undefined` if the input cannot be represented as JSON\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public static buildJsonDumpObject(input: any, options?: IBuildJsonDumpObjectOptions): any | undefined {\n if (!options) {\n options = {};\n }\n\n const keyNamesToOmit: Set<string> = new Set(options.keyNamesToOmit);\n\n return MessageRouter._buildJsonDumpObject(input, keyNamesToOmit);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _buildJsonDumpObject(input: any, keyNamesToOmit: Set<string>): any | undefined {\n if (input === null || input === undefined) {\n return null; // JSON uses null instead of undefined\n }\n\n switch (typeof input) {\n case 'boolean':\n case 'number':\n case 'string':\n return input;\n case 'object':\n if (Array.isArray(input)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const outputArray: any[] = [];\n for (const element of input) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const serializedElement: any = MessageRouter._buildJsonDumpObject(element, keyNamesToOmit);\n if (serializedElement !== undefined) {\n outputArray.push(serializedElement);\n }\n }\n return outputArray;\n }\n\n const outputObject: object = {};\n for (const key of Object.getOwnPropertyNames(input)) {\n if (keyNamesToOmit.has(key)) {\n continue;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const value: any = input[key];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const serializedValue: any = MessageRouter._buildJsonDumpObject(value, keyNamesToOmit);\n\n if (serializedValue !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (outputObject as any)[key] = serializedValue;\n }\n }\n return outputObject;\n }\n\n return undefined;\n }\n\n /**\n * Record this message in _associatedMessagesForAstDeclaration\n */\n private _associateMessageWithAstDeclaration(\n extractorMessage: ExtractorMessage,\n astDeclaration: AstDeclaration\n ): void {\n let associatedMessages: ExtractorMessage[] | undefined =\n this._associatedMessagesForAstDeclaration.get(astDeclaration);\n\n if (!associatedMessages) {\n associatedMessages = [];\n this._associatedMessagesForAstDeclaration.set(astDeclaration, associatedMessages);\n }\n associatedMessages.push(extractorMessage);\n }\n\n /**\n * Add a message for a location in an arbitrary source file.\n */\n public addAnalyzerIssueForPosition(\n messageId: ExtractorMessageId,\n messageText: string,\n sourceFile: ts.SourceFile,\n pos: number,\n properties?: IExtractorMessageProperties\n ): ExtractorMessage {\n const options: IExtractorMessageOptions = {\n category: ExtractorMessageCategory.Extractor,\n messageId,\n text: messageText,\n properties\n };\n\n const sourceLocation: ISourceLocation = this._sourceMapper.getSourceLocation({\n sourceFile,\n pos\n });\n options.sourceFilePath = sourceLocation.sourceFilePath;\n options.sourceFileLine = sourceLocation.sourceFileLine;\n options.sourceFileColumn = sourceLocation.sourceFileColumn;\n\n const extractorMessage: ExtractorMessage = new ExtractorMessage(options);\n\n this._messages.push(extractorMessage);\n return extractorMessage;\n }\n\n /**\n * This is used when writing the API report file. It looks up any messages that were configured to get emitted\n * in the API report file and returns them. It also records that they were emitted, which suppresses them from\n * being shown on the console.\n */\n public fetchAssociatedMessagesForReviewFile(astDeclaration: AstDeclaration): ExtractorMessage[] {\n const messagesForApiReportFile: ExtractorMessage[] = [];\n\n const associatedMessages: ExtractorMessage[] =\n this._associatedMessagesForAstDeclaration.get(astDeclaration) || [];\n for (const associatedMessage of associatedMessages) {\n // Make sure we didn't already report this message for some reason\n if (!associatedMessage.handled) {\n // Is this message type configured to go in the API report file?\n const reportingRule: IReportingRule = this._getRuleForMessage(associatedMessage);\n if (reportingRule.addToApiReportFile) {\n // Include it in the result, and record that it went to the API report file\n messagesForApiReportFile.push(associatedMessage);\n associatedMessage.handled = true;\n }\n }\n }\n\n this._sortMessagesForOutput(messagesForApiReportFile);\n return messagesForApiReportFile;\n }\n\n /**\n * This returns all remaining messages that were flagged with `addToApiReportFile`, but which were not\n * retreieved using `fetchAssociatedMessagesForReviewFile()`.\n */\n public fetchUnassociatedMessagesForReviewFile(): ExtractorMessage[] {\n const messagesForApiReportFile: ExtractorMessage[] = [];\n\n for (const unassociatedMessage of this.messages) {\n // Make sure we didn't already report this message for some reason\n if (!unassociatedMessage.handled) {\n // Is this message type configured to go in the API report file?\n const reportingRule: IReportingRule = this._getRuleForMessage(unassociatedMessage);\n if (reportingRule.addToApiReportFile) {\n // Include it in the result, and record that it went to the API report file\n messagesForApiReportFile.push(unassociatedMessage);\n unassociatedMessage.handled = true;\n }\n }\n }\n\n this._sortMessagesForOutput(messagesForApiReportFile);\n return messagesForApiReportFile;\n }\n\n /**\n * This returns the list of remaining messages that were not already processed by\n * `fetchAssociatedMessagesForReviewFile()` or `fetchUnassociatedMessagesForReviewFile()`.\n * These messages will be shown on the console.\n */\n public handleRemainingNonConsoleMessages(): void {\n const messagesForLogger: ExtractorMessage[] = [];\n\n for (const message of this.messages) {\n // Make sure we didn't already report this message\n if (!message.handled) {\n messagesForLogger.push(message);\n }\n }\n\n this._sortMessagesForOutput(messagesForLogger);\n\n for (const message of messagesForLogger) {\n this._handleMessage(message);\n }\n }\n\n public logError(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Error\n })\n );\n }\n\n public logWarning(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Warning\n })\n );\n }\n\n public logInfo(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Info\n })\n );\n }\n\n public logVerbose(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Verbose\n })\n );\n }\n\n public logDiagnosticHeader(title: string): void {\n this.logDiagnostic(MessageRouter.DIAGNOSTICS_LINE);\n this.logDiagnostic(`DIAGNOSTIC: ` + title);\n this.logDiagnostic(MessageRouter.DIAGNOSTICS_LINE);\n }\n\n public logDiagnosticFooter(): void {\n this.logDiagnostic(MessageRouter.DIAGNOSTICS_LINE + '\\n');\n }\n\n public logDiagnostic(message: string): void {\n if (this.showDiagnostics) {\n this.logVerbose(ConsoleMessageId.Diagnostics, message);\n }\n }\n\n /**\n * Give the calling application a chance to handle the `ExtractorMessage`, and if not, display it on the console.\n */\n private _handleMessage(message: ExtractorMessage): void {\n // Don't tally messages that were already \"handled\" by writing them into the API report\n if (message.handled) {\n return;\n }\n\n // Assign the ExtractorMessage.logLevel; the message callback may adjust it below\n if (message.category === ExtractorMessageCategory.Console) {\n // Console messages have their category log level assigned via logInfo(), logVerbose(), etc.\n } else {\n const reportingRule: IReportingRule = this._getRuleForMessage(message);\n message.logLevel = reportingRule.logLevel;\n }\n\n // If there is a callback, allow it to modify and/or handle the message\n if (this._messageCallback) {\n this._messageCallback(message);\n }\n\n // Update the statistics\n switch (message.logLevel) {\n case ExtractorLogLevel.Error:\n ++this.errorCount;\n break;\n case ExtractorLogLevel.Warning:\n ++this.warningCount;\n break;\n }\n\n if (message.handled) {\n return;\n }\n\n // The messageCallback did not handle the message, so perform default handling\n message.handled = true;\n\n if (message.logLevel === ExtractorLogLevel.None) {\n return;\n }\n\n let messageText: string;\n if (message.category === ExtractorMessageCategory.Console) {\n messageText = message.text;\n } else {\n messageText = message.formatMessageWithLocation(this._workingPackageFolder);\n }\n\n switch (message.logLevel) {\n case ExtractorLogLevel.Error:\n console.error(colors.red('Error: ' + messageText));\n break;\n case ExtractorLogLevel.Warning:\n console.warn(colors.yellow('Warning: ' + messageText));\n break;\n case ExtractorLogLevel.Info:\n console.log(messageText);\n break;\n case ExtractorLogLevel.Verbose:\n if (this.showVerboseMessages) {\n console.log(colors.cyan(messageText));\n }\n break;\n default:\n throw new Error(`Invalid logLevel value: ${JSON.stringify(message.logLevel)}`);\n }\n }\n\n /**\n * For a given message, determine the IReportingRule based on the rule tables.\n */\n private _getRuleForMessage(message: ExtractorMessage): IReportingRule {\n const reportingRule: IReportingRule | undefined = this._reportingRuleByMessageId.get(message.messageId);\n if (reportingRule) {\n return reportingRule;\n }\n switch (message.category) {\n case ExtractorMessageCategory.Compiler:\n return this._compilerDefaultRule;\n case ExtractorMessageCategory.Extractor:\n return this._extractorDefaultRule;\n case ExtractorMessageCategory.TSDoc:\n return this._tsdocDefaultRule;\n case ExtractorMessageCategory.Console:\n throw new InternalError('ExtractorMessageCategory.Console is not supported with IReportingRule');\n }\n }\n\n /**\n * Sorts an array of messages according to a reasonable ordering\n */\n private _sortMessagesForOutput(messages: ExtractorMessage[]): void {\n messages.sort((a, b) => {\n let diff: number;\n // First sort by file name\n diff = Sort.compareByValue(a.sourceFilePath, b.sourceFilePath);\n if (diff !== 0) {\n return diff;\n }\n // Then sort by line number\n diff = Sort.compareByValue(a.sourceFileLine, b.sourceFileLine);\n if (diff !== 0) {\n return diff;\n }\n // Then sort by messageId\n return Sort.compareByValue(a.messageId, b.messageId);\n });\n }\n}\n"]}
1
+ {"version":3,"file":"MessageRouter.js","sourceRoot":"","sources":["../../src/collector/MessageRouter.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport colors from 'colors';\nimport * as ts from 'typescript';\nimport * as tsdoc from '@microsoft/tsdoc';\nimport { Sort, InternalError } from '@rushstack/node-core-library';\n\nimport { AstDeclaration } from '../analyzer/AstDeclaration';\nimport { AstSymbol } from '../analyzer/AstSymbol';\nimport {\n ExtractorMessage,\n ExtractorMessageCategory,\n IExtractorMessageOptions,\n IExtractorMessageProperties\n} from '../api/ExtractorMessage';\nimport { ExtractorMessageId, allExtractorMessageIds } from '../api/ExtractorMessageId';\nimport { IExtractorMessagesConfig, IConfigMessageReportingRule } from '../api/IConfigFile';\nimport { ISourceLocation, SourceMapper } from './SourceMapper';\nimport { ExtractorLogLevel } from '../api/ExtractorLogLevel';\nimport { ConsoleMessageId } from '../api/ConsoleMessageId';\n\ninterface IReportingRule {\n logLevel: ExtractorLogLevel;\n addToApiReportFile: boolean;\n}\n\nexport interface IMessageRouterOptions {\n workingPackageFolder: string | undefined;\n messageCallback: ((message: ExtractorMessage) => void) | undefined;\n messagesConfig: IExtractorMessagesConfig;\n showVerboseMessages: boolean;\n showDiagnostics: boolean;\n tsdocConfiguration: tsdoc.TSDocConfiguration;\n sourceMapper: SourceMapper;\n}\n\nexport interface IBuildJsonDumpObjectOptions {\n /**\n * {@link MessageRouter.buildJsonDumpObject} will omit any objects keys with these names.\n */\n keyNamesToOmit?: string[];\n}\n\nexport class MessageRouter {\n public static readonly DIAGNOSTICS_LINE: string =\n '============================================================';\n\n private readonly _workingPackageFolder: string | undefined;\n private readonly _messageCallback: ((message: ExtractorMessage) => void) | undefined;\n\n // All messages\n private readonly _messages: ExtractorMessage[];\n\n // For each AstDeclaration, the messages associated with it. This is used when addToApiReportFile=true\n private readonly _associatedMessagesForAstDeclaration: Map<AstDeclaration, ExtractorMessage[]>;\n\n private readonly _sourceMapper: SourceMapper;\n\n private readonly _tsdocConfiguration: tsdoc.TSDocConfiguration;\n\n // Normalized representation of the routing rules from api-extractor.json\n private _reportingRuleByMessageId: Map<string, IReportingRule> = new Map<string, IReportingRule>();\n private _compilerDefaultRule: IReportingRule = {\n logLevel: ExtractorLogLevel.None,\n addToApiReportFile: false\n };\n private _extractorDefaultRule: IReportingRule = {\n logLevel: ExtractorLogLevel.None,\n addToApiReportFile: false\n };\n private _tsdocDefaultRule: IReportingRule = { logLevel: ExtractorLogLevel.None, addToApiReportFile: false };\n\n public errorCount: number = 0;\n public warningCount: number = 0;\n\n /**\n * See {@link IExtractorInvokeOptions.showVerboseMessages}\n */\n public readonly showVerboseMessages: boolean;\n\n /**\n * See {@link IExtractorInvokeOptions.showDiagnostics}\n */\n public readonly showDiagnostics: boolean;\n\n public constructor(options: IMessageRouterOptions) {\n this._workingPackageFolder = options.workingPackageFolder;\n this._messageCallback = options.messageCallback;\n\n this._messages = [];\n this._associatedMessagesForAstDeclaration = new Map<AstDeclaration, ExtractorMessage[]>();\n this._sourceMapper = options.sourceMapper;\n this._tsdocConfiguration = options.tsdocConfiguration;\n\n // showDiagnostics implies showVerboseMessages\n this.showVerboseMessages = options.showVerboseMessages || options.showDiagnostics;\n this.showDiagnostics = options.showDiagnostics;\n\n this._applyMessagesConfig(options.messagesConfig);\n }\n\n /**\n * Read the api-extractor.json configuration and build up the tables of routing rules.\n */\n private _applyMessagesConfig(messagesConfig: IExtractorMessagesConfig): void {\n if (messagesConfig.compilerMessageReporting) {\n for (const messageId of Object.getOwnPropertyNames(messagesConfig.compilerMessageReporting)) {\n const reportingRule: IReportingRule = MessageRouter._getNormalizedRule(\n messagesConfig.compilerMessageReporting[messageId]\n );\n\n if (messageId === 'default') {\n this._compilerDefaultRule = reportingRule;\n } else if (!/^TS[0-9]+$/.test(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.compilerMessageReporting table contains` +\n ` an invalid entry \"${messageId}\". The identifier format is \"TS\" followed by an integer.`\n );\n } else {\n this._reportingRuleByMessageId.set(messageId, reportingRule);\n }\n }\n }\n\n if (messagesConfig.extractorMessageReporting) {\n for (const messageId of Object.getOwnPropertyNames(messagesConfig.extractorMessageReporting)) {\n const reportingRule: IReportingRule = MessageRouter._getNormalizedRule(\n messagesConfig.extractorMessageReporting[messageId]\n );\n\n if (messageId === 'default') {\n this._extractorDefaultRule = reportingRule;\n } else if (!/^ae-/.test(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.extractorMessageReporting table contains` +\n ` an invalid entry \"${messageId}\". The name should begin with the \"ae-\" prefix.`\n );\n } else if (!allExtractorMessageIds.has(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.extractorMessageReporting table contains` +\n ` an unrecognized identifier \"${messageId}\". Is it spelled correctly?`\n );\n } else {\n this._reportingRuleByMessageId.set(messageId, reportingRule);\n }\n }\n }\n\n if (messagesConfig.tsdocMessageReporting) {\n for (const messageId of Object.getOwnPropertyNames(messagesConfig.tsdocMessageReporting)) {\n const reportingRule: IReportingRule = MessageRouter._getNormalizedRule(\n messagesConfig.tsdocMessageReporting[messageId]\n );\n\n if (messageId === 'default') {\n this._tsdocDefaultRule = reportingRule;\n } else if (!/^tsdoc-/.test(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.tsdocMessageReporting table contains` +\n ` an invalid entry \"${messageId}\". The name should begin with the \"tsdoc-\" prefix.`\n );\n } else if (!this._tsdocConfiguration.isKnownMessageId(messageId)) {\n throw new Error(\n `Error in API Extractor config: The messages.tsdocMessageReporting table contains` +\n ` an unrecognized identifier \"${messageId}\". Is it spelled correctly?`\n );\n } else {\n this._reportingRuleByMessageId.set(messageId, reportingRule);\n }\n }\n }\n }\n\n private static _getNormalizedRule(rule: IConfigMessageReportingRule): IReportingRule {\n return {\n logLevel: rule.logLevel || 'none',\n addToApiReportFile: rule.addToApiReportFile || false\n };\n }\n\n public get messages(): ReadonlyArray<ExtractorMessage> {\n return this._messages;\n }\n\n /**\n * Add a diagnostic message reported by the TypeScript compiler\n */\n public addCompilerDiagnostic(diagnostic: ts.Diagnostic): void {\n switch (diagnostic.category) {\n case ts.DiagnosticCategory.Suggestion:\n case ts.DiagnosticCategory.Message:\n return; // ignore noise\n }\n\n const messageText: string = ts.flattenDiagnosticMessageText(diagnostic.messageText, '\\n');\n const options: IExtractorMessageOptions = {\n category: ExtractorMessageCategory.Compiler,\n messageId: `TS${diagnostic.code}`,\n text: messageText\n };\n\n if (diagnostic.file) {\n // NOTE: Since compiler errors pertain to issues specific to the .d.ts files,\n // we do not apply source mappings for them.\n const sourceFile: ts.SourceFile = diagnostic.file;\n const sourceLocation: ISourceLocation = this._sourceMapper.getSourceLocation({\n sourceFile,\n pos: diagnostic.start || 0,\n useDtsLocation: true\n });\n options.sourceFilePath = sourceLocation.sourceFilePath;\n options.sourceFileLine = sourceLocation.sourceFileLine;\n options.sourceFileColumn = sourceLocation.sourceFileColumn;\n }\n\n this._messages.push(new ExtractorMessage(options));\n }\n\n /**\n * Add a message from the API Extractor analysis\n */\n public addAnalyzerIssue(\n messageId: ExtractorMessageId,\n messageText: string,\n astDeclarationOrSymbol: AstDeclaration | AstSymbol,\n properties?: IExtractorMessageProperties\n ): void {\n let astDeclaration: AstDeclaration;\n if (astDeclarationOrSymbol instanceof AstDeclaration) {\n astDeclaration = astDeclarationOrSymbol;\n } else {\n astDeclaration = astDeclarationOrSymbol.astDeclarations[0];\n }\n\n const extractorMessage: ExtractorMessage = this.addAnalyzerIssueForPosition(\n messageId,\n messageText,\n astDeclaration.declaration.getSourceFile(),\n astDeclaration.declaration.getStart(),\n properties\n );\n\n this._associateMessageWithAstDeclaration(extractorMessage, astDeclaration);\n }\n\n /**\n * Add all messages produced from an invocation of the TSDoc parser, assuming they refer to\n * code in the specified source file.\n */\n public addTsdocMessages(\n parserContext: tsdoc.ParserContext,\n sourceFile: ts.SourceFile,\n astDeclaration?: AstDeclaration\n ): void {\n for (const message of parserContext.log.messages) {\n const options: IExtractorMessageOptions = {\n category: ExtractorMessageCategory.TSDoc,\n messageId: message.messageId,\n text: message.unformattedText\n };\n\n const sourceLocation: ISourceLocation = this._sourceMapper.getSourceLocation({\n sourceFile,\n pos: message.textRange.pos\n });\n options.sourceFilePath = sourceLocation.sourceFilePath;\n options.sourceFileLine = sourceLocation.sourceFileLine;\n options.sourceFileColumn = sourceLocation.sourceFileColumn;\n\n const extractorMessage: ExtractorMessage = new ExtractorMessage(options);\n\n if (astDeclaration) {\n this._associateMessageWithAstDeclaration(extractorMessage, astDeclaration);\n }\n\n this._messages.push(extractorMessage);\n }\n }\n\n /**\n * Recursively collects the primitive members (numbers, strings, arrays, etc) into an object that\n * is JSON serializable. This is used by the \"--diagnostics\" feature to dump the state of configuration objects.\n *\n * @returns a JSON serializable object (possibly including `null` values)\n * or `undefined` if the input cannot be represented as JSON\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public static buildJsonDumpObject(input: any, options?: IBuildJsonDumpObjectOptions): any | undefined {\n if (!options) {\n options = {};\n }\n\n const keyNamesToOmit: Set<string> = new Set(options.keyNamesToOmit);\n\n return MessageRouter._buildJsonDumpObject(input, keyNamesToOmit);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _buildJsonDumpObject(input: any, keyNamesToOmit: Set<string>): any | undefined {\n if (input === null || input === undefined) {\n return null; // JSON uses null instead of undefined\n }\n\n switch (typeof input) {\n case 'boolean':\n case 'number':\n case 'string':\n return input;\n case 'object':\n if (Array.isArray(input)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const outputArray: any[] = [];\n for (const element of input) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const serializedElement: any = MessageRouter._buildJsonDumpObject(element, keyNamesToOmit);\n if (serializedElement !== undefined) {\n outputArray.push(serializedElement);\n }\n }\n return outputArray;\n }\n\n const outputObject: object = {};\n for (const key of Object.getOwnPropertyNames(input)) {\n if (keyNamesToOmit.has(key)) {\n continue;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const value: any = input[key];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const serializedValue: any = MessageRouter._buildJsonDumpObject(value, keyNamesToOmit);\n\n if (serializedValue !== undefined) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (outputObject as any)[key] = serializedValue;\n }\n }\n return outputObject;\n }\n\n return undefined;\n }\n\n /**\n * Record this message in _associatedMessagesForAstDeclaration\n */\n private _associateMessageWithAstDeclaration(\n extractorMessage: ExtractorMessage,\n astDeclaration: AstDeclaration\n ): void {\n let associatedMessages: ExtractorMessage[] | undefined =\n this._associatedMessagesForAstDeclaration.get(astDeclaration);\n\n if (!associatedMessages) {\n associatedMessages = [];\n this._associatedMessagesForAstDeclaration.set(astDeclaration, associatedMessages);\n }\n associatedMessages.push(extractorMessage);\n }\n\n /**\n * Add a message for a location in an arbitrary source file.\n */\n public addAnalyzerIssueForPosition(\n messageId: ExtractorMessageId,\n messageText: string,\n sourceFile: ts.SourceFile,\n pos: number,\n properties?: IExtractorMessageProperties\n ): ExtractorMessage {\n const options: IExtractorMessageOptions = {\n category: ExtractorMessageCategory.Extractor,\n messageId,\n text: messageText,\n properties\n };\n\n const sourceLocation: ISourceLocation = this._sourceMapper.getSourceLocation({\n sourceFile,\n pos\n });\n options.sourceFilePath = sourceLocation.sourceFilePath;\n options.sourceFileLine = sourceLocation.sourceFileLine;\n options.sourceFileColumn = sourceLocation.sourceFileColumn;\n\n const extractorMessage: ExtractorMessage = new ExtractorMessage(options);\n\n this._messages.push(extractorMessage);\n return extractorMessage;\n }\n\n /**\n * This is used when writing the API report file. It looks up any messages that were configured to get emitted\n * in the API report file and returns them. It also records that they were emitted, which suppresses them from\n * being shown on the console.\n */\n public fetchAssociatedMessagesForReviewFile(astDeclaration: AstDeclaration): ExtractorMessage[] {\n const messagesForApiReportFile: ExtractorMessage[] = [];\n\n const associatedMessages: ExtractorMessage[] =\n this._associatedMessagesForAstDeclaration.get(astDeclaration) || [];\n for (const associatedMessage of associatedMessages) {\n // Make sure we didn't already report this message for some reason\n if (!associatedMessage.handled) {\n // Is this message type configured to go in the API report file?\n const reportingRule: IReportingRule = this._getRuleForMessage(associatedMessage);\n if (reportingRule.addToApiReportFile) {\n // Include it in the result, and record that it went to the API report file\n messagesForApiReportFile.push(associatedMessage);\n associatedMessage.handled = true;\n }\n }\n }\n\n this._sortMessagesForOutput(messagesForApiReportFile);\n return messagesForApiReportFile;\n }\n\n /**\n * This returns all remaining messages that were flagged with `addToApiReportFile`, but which were not\n * retreieved using `fetchAssociatedMessagesForReviewFile()`.\n */\n public fetchUnassociatedMessagesForReviewFile(): ExtractorMessage[] {\n const messagesForApiReportFile: ExtractorMessage[] = [];\n\n for (const unassociatedMessage of this.messages) {\n // Make sure we didn't already report this message for some reason\n if (!unassociatedMessage.handled) {\n // Is this message type configured to go in the API report file?\n const reportingRule: IReportingRule = this._getRuleForMessage(unassociatedMessage);\n if (reportingRule.addToApiReportFile) {\n // Include it in the result, and record that it went to the API report file\n messagesForApiReportFile.push(unassociatedMessage);\n unassociatedMessage.handled = true;\n }\n }\n }\n\n this._sortMessagesForOutput(messagesForApiReportFile);\n return messagesForApiReportFile;\n }\n\n /**\n * This returns the list of remaining messages that were not already processed by\n * `fetchAssociatedMessagesForReviewFile()` or `fetchUnassociatedMessagesForReviewFile()`.\n * These messages will be shown on the console.\n */\n public handleRemainingNonConsoleMessages(): void {\n const messagesForLogger: ExtractorMessage[] = [];\n\n for (const message of this.messages) {\n // Make sure we didn't already report this message\n if (!message.handled) {\n messagesForLogger.push(message);\n }\n }\n\n this._sortMessagesForOutput(messagesForLogger);\n\n for (const message of messagesForLogger) {\n this._handleMessage(message);\n }\n }\n\n public logError(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Error\n })\n );\n }\n\n public logWarning(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Warning\n })\n );\n }\n\n public logInfo(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Info\n })\n );\n }\n\n public logVerbose(\n messageId: ConsoleMessageId,\n message: string,\n properties?: IExtractorMessageProperties\n ): void {\n this._handleMessage(\n new ExtractorMessage({\n category: ExtractorMessageCategory.Console,\n messageId,\n text: message,\n properties,\n logLevel: ExtractorLogLevel.Verbose\n })\n );\n }\n\n public logDiagnosticHeader(title: string): void {\n this.logDiagnostic(MessageRouter.DIAGNOSTICS_LINE);\n this.logDiagnostic(`DIAGNOSTIC: ` + title);\n this.logDiagnostic(MessageRouter.DIAGNOSTICS_LINE);\n }\n\n public logDiagnosticFooter(): void {\n this.logDiagnostic(MessageRouter.DIAGNOSTICS_LINE + '\\n');\n }\n\n public logDiagnostic(message: string): void {\n if (this.showDiagnostics) {\n this.logVerbose(ConsoleMessageId.Diagnostics, message);\n }\n }\n\n /**\n * Give the calling application a chance to handle the `ExtractorMessage`, and if not, display it on the console.\n */\n private _handleMessage(message: ExtractorMessage): void {\n // Don't tally messages that were already \"handled\" by writing them into the API report\n if (message.handled) {\n return;\n }\n\n // Assign the ExtractorMessage.logLevel; the message callback may adjust it below\n if (message.category === ExtractorMessageCategory.Console) {\n // Console messages have their category log level assigned via logInfo(), logVerbose(), etc.\n } else {\n const reportingRule: IReportingRule = this._getRuleForMessage(message);\n message.logLevel = reportingRule.logLevel;\n }\n\n // If there is a callback, allow it to modify and/or handle the message\n if (this._messageCallback) {\n this._messageCallback(message);\n }\n\n // Update the statistics\n switch (message.logLevel) {\n case ExtractorLogLevel.Error:\n ++this.errorCount;\n break;\n case ExtractorLogLevel.Warning:\n ++this.warningCount;\n break;\n }\n\n if (message.handled) {\n return;\n }\n\n // The messageCallback did not handle the message, so perform default handling\n message.handled = true;\n\n if (message.logLevel === ExtractorLogLevel.None) {\n return;\n }\n\n let messageText: string;\n if (message.category === ExtractorMessageCategory.Console) {\n messageText = message.text;\n } else {\n messageText = message.formatMessageWithLocation(this._workingPackageFolder);\n }\n\n switch (message.logLevel) {\n case ExtractorLogLevel.Error:\n console.error(colors.red('Error: ' + messageText));\n break;\n case ExtractorLogLevel.Warning:\n console.warn(colors.yellow('Warning: ' + messageText));\n break;\n case ExtractorLogLevel.Info:\n console.log(messageText);\n break;\n case ExtractorLogLevel.Verbose:\n if (this.showVerboseMessages) {\n console.log(colors.cyan(messageText));\n }\n break;\n default:\n throw new Error(`Invalid logLevel value: ${JSON.stringify(message.logLevel)}`);\n }\n }\n\n /**\n * For a given message, determine the IReportingRule based on the rule tables.\n */\n private _getRuleForMessage(message: ExtractorMessage): IReportingRule {\n const reportingRule: IReportingRule | undefined = this._reportingRuleByMessageId.get(message.messageId);\n if (reportingRule) {\n return reportingRule;\n }\n switch (message.category) {\n case ExtractorMessageCategory.Compiler:\n return this._compilerDefaultRule;\n case ExtractorMessageCategory.Extractor:\n return this._extractorDefaultRule;\n case ExtractorMessageCategory.TSDoc:\n return this._tsdocDefaultRule;\n case ExtractorMessageCategory.Console:\n throw new InternalError('ExtractorMessageCategory.Console is not supported with IReportingRule');\n }\n }\n\n /**\n * Sorts an array of messages according to a reasonable ordering\n */\n private _sortMessagesForOutput(messages: ExtractorMessage[]): void {\n messages.sort((a, b) => {\n let diff: number;\n // First sort by file name\n diff = Sort.compareByValue(a.sourceFilePath, b.sourceFilePath);\n if (diff !== 0) {\n return diff;\n }\n // Then sort by line number\n diff = Sort.compareByValue(a.sourceFileLine, b.sourceFileLine);\n if (diff !== 0) {\n return diff;\n }\n // Then sort by messageId\n return Sort.compareByValue(a.messageId, b.messageId);\n });\n }\n}\n"]}
@@ -441,6 +441,6 @@ class ApiReportGenerator {
441
441
  }
442
442
  }
443
443
  }
444
- exports.ApiReportGenerator = ApiReportGenerator;
445
444
  ApiReportGenerator._trimSpacesRegExp = / +$/gm;
445
+ exports.ApiReportGenerator = ApiReportGenerator;
446
446
  //# sourceMappingURL=ApiReportGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApiReportGenerator.js","sourceRoot":"","sources":["../../src/generators/ApiReportGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as ts from 'typescript';\nimport { Text, InternalError } from '@rushstack/node-core-library';\nimport { ReleaseTag } from '@microsoft/api-extractor-model';\n\nimport { Collector } from '../collector/Collector';\nimport { TypeScriptHelpers } from '../analyzer/TypeScriptHelpers';\nimport { Span } from '../analyzer/Span';\nimport { CollectorEntity } from '../collector/CollectorEntity';\nimport { AstDeclaration } from '../analyzer/AstDeclaration';\nimport { ApiItemMetadata } from '../collector/ApiItemMetadata';\nimport { AstImport } from '../analyzer/AstImport';\nimport { AstSymbol } from '../analyzer/AstSymbol';\nimport { ExtractorMessage } from '../api/ExtractorMessage';\nimport { IndentedWriter } from './IndentedWriter';\nimport { DtsEmitHelpers } from './DtsEmitHelpers';\nimport { AstNamespaceImport } from '../analyzer/AstNamespaceImport';\nimport { AstEntity } from '../analyzer/AstEntity';\nimport { AstModuleExportInfo } from '../analyzer/AstModule';\nimport { SourceFileLocationFormatter } from '../analyzer/SourceFileLocationFormatter';\n\nexport class ApiReportGenerator {\n private static _trimSpacesRegExp: RegExp = / +$/gm;\n\n /**\n * Compares the contents of two API files that were created using ApiFileGenerator,\n * and returns true if they are equivalent. Note that these files are not normally edited\n * by a human; the \"equivalence\" comparison here is intended to ignore spurious changes that\n * might be introduced by a tool, e.g. Git newline normalization or an editor that strips\n * whitespace when saving.\n */\n public static areEquivalentApiFileContents(\n actualFileContent: string,\n expectedFileContent: string\n ): boolean {\n // NOTE: \"\\s\" also matches \"\\r\" and \"\\n\"\n const normalizedActual: string = actualFileContent.replace(/[\\s]+/g, ' ');\n const normalizedExpected: string = expectedFileContent.replace(/[\\s]+/g, ' ');\n return normalizedActual === normalizedExpected;\n }\n\n public static generateReviewFileContent(collector: Collector): string {\n const writer: IndentedWriter = new IndentedWriter();\n writer.trimLeadingSpaces = true;\n\n writer.writeLine(\n [\n `## API Report File for \"${collector.workingPackage.name}\"`,\n ``,\n `> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).`,\n ``\n ].join('\\n')\n );\n\n // Write the opening delimiter for the Markdown code fence\n writer.writeLine('```ts\\n');\n\n // Emit the triple slash directives\n for (const typeDirectiveReference of Array.from(collector.dtsTypeReferenceDirectives).sort()) {\n // https://github.com/microsoft/TypeScript/blob/611ebc7aadd7a44a4c0447698bfda9222a78cb66/src/compiler/declarationEmitter.ts#L162\n writer.writeLine(`/// <reference types=\"${typeDirectiveReference}\" />`);\n }\n for (const libDirectiveReference of Array.from(collector.dtsLibReferenceDirectives).sort()) {\n writer.writeLine(`/// <reference lib=\"${libDirectiveReference}\" />`);\n }\n writer.ensureSkippedLine();\n\n // Emit the imports\n for (const entity of collector.entities) {\n if (entity.astEntity instanceof AstImport) {\n DtsEmitHelpers.emitImport(writer, entity, entity.astEntity);\n }\n }\n writer.ensureSkippedLine();\n\n // Emit the regular declarations\n for (const entity of collector.entities) {\n const astEntity: AstEntity = entity.astEntity;\n if (entity.consumable || collector.extractorConfig.apiReportIncludeForgottenExports) {\n // First, collect the list of export names for this symbol. When reporting messages with\n // ExtractorMessage.properties.exportName, this will enable us to emit the warning comments alongside\n // the associated export statement.\n interface IExportToEmit {\n readonly exportName: string;\n readonly associatedMessages: ExtractorMessage[];\n }\n const exportsToEmit: Map<string, IExportToEmit> = new Map<string, IExportToEmit>();\n\n for (const exportName of entity.exportNames) {\n if (!entity.shouldInlineExport) {\n exportsToEmit.set(exportName, { exportName, associatedMessages: [] });\n }\n }\n\n if (astEntity instanceof AstSymbol) {\n // Emit all the declarations for this entity\n for (const astDeclaration of astEntity.astDeclarations || []) {\n // Get the messages associated with this declaration\n const fetchedMessages: ExtractorMessage[] =\n collector.messageRouter.fetchAssociatedMessagesForReviewFile(astDeclaration);\n\n // Peel off the messages associated with an export statement and store them\n // in IExportToEmit.associatedMessages (to be processed later). The remaining messages will\n // added to messagesToReport, to be emitted next to the declaration instead of the export statement.\n const messagesToReport: ExtractorMessage[] = [];\n for (const message of fetchedMessages) {\n if (message.properties.exportName) {\n const exportToEmit: IExportToEmit | undefined = exportsToEmit.get(\n message.properties.exportName\n );\n if (exportToEmit) {\n exportToEmit.associatedMessages.push(message);\n continue;\n }\n }\n messagesToReport.push(message);\n }\n\n writer.ensureSkippedLine();\n writer.write(ApiReportGenerator._getAedocSynopsis(collector, astDeclaration, messagesToReport));\n\n const span: Span = new Span(astDeclaration.declaration);\n\n const apiItemMetadata: ApiItemMetadata = collector.fetchApiItemMetadata(astDeclaration);\n if (apiItemMetadata.isPreapproved) {\n ApiReportGenerator._modifySpanForPreapproved(span);\n } else {\n ApiReportGenerator._modifySpan(collector, span, entity, astDeclaration, false);\n }\n\n span.writeModifiedText(writer);\n writer.ensureNewLine();\n }\n }\n\n if (astEntity instanceof AstNamespaceImport) {\n const astModuleExportInfo: AstModuleExportInfo = astEntity.fetchAstModuleExportInfo(collector);\n\n if (entity.nameForEmit === undefined) {\n // This should never happen\n throw new InternalError('referencedEntry.nameForEmit is undefined');\n }\n\n if (astModuleExportInfo.starExportedExternalModules.size > 0) {\n // We could support this, but we would need to find a way to safely represent it.\n throw new Error(\n `The ${entity.nameForEmit} namespace import includes a star export, which is not supported:\\n` +\n SourceFileLocationFormatter.formatDeclaration(astEntity.declaration)\n );\n }\n\n // Emit a synthetic declaration for the namespace. It will look like this:\n //\n // declare namespace example {\n // export {\n // f1,\n // f2\n // }\n // }\n //\n // Note that we do not try to relocate f1()/f2() to be inside the namespace because other type\n // signatures may reference them directly (without using the namespace qualifier).\n\n writer.ensureSkippedLine();\n writer.writeLine(`declare namespace ${entity.nameForEmit} {`);\n\n // all local exports of local imported module are just references to top-level declarations\n writer.increaseIndent();\n writer.writeLine('export {');\n writer.increaseIndent();\n\n const exportClauses: string[] = [];\n for (const [exportedName, exportedEntity] of astModuleExportInfo.exportedLocalEntities) {\n const collectorEntity: CollectorEntity | undefined =\n collector.tryGetCollectorEntity(exportedEntity);\n if (collectorEntity === undefined) {\n // This should never happen\n // top-level exports of local imported module should be added as collector entities before\n throw new InternalError(\n `Cannot find collector entity for ${entity.nameForEmit}.${exportedEntity.localName}`\n );\n }\n\n if (collectorEntity.nameForEmit === exportedName) {\n exportClauses.push(collectorEntity.nameForEmit);\n } else {\n exportClauses.push(`${collectorEntity.nameForEmit} as ${exportedName}`);\n }\n }\n writer.writeLine(exportClauses.join(',\\n'));\n\n writer.decreaseIndent();\n writer.writeLine('}'); // end of \"export { ... }\"\n writer.decreaseIndent();\n writer.writeLine('}'); // end of \"declare namespace { ... }\"\n }\n\n // Now emit the export statements for this entity.\n for (const exportToEmit of exportsToEmit.values()) {\n // Write any associated messages\n if (exportToEmit.associatedMessages.length > 0) {\n writer.ensureSkippedLine();\n for (const message of exportToEmit.associatedMessages) {\n ApiReportGenerator._writeLineAsComments(\n writer,\n 'Warning: ' + message.formatMessageWithoutLocation()\n );\n }\n }\n\n DtsEmitHelpers.emitNamedExport(writer, exportToEmit.exportName, entity);\n }\n writer.ensureSkippedLine();\n }\n }\n\n DtsEmitHelpers.emitStarExports(writer, collector);\n\n // Write the unassociated warnings at the bottom of the file\n const unassociatedMessages: ExtractorMessage[] =\n collector.messageRouter.fetchUnassociatedMessagesForReviewFile();\n if (unassociatedMessages.length > 0) {\n writer.ensureSkippedLine();\n ApiReportGenerator._writeLineAsComments(writer, 'Warnings were encountered during analysis:');\n ApiReportGenerator._writeLineAsComments(writer, '');\n for (const unassociatedMessage of unassociatedMessages) {\n ApiReportGenerator._writeLineAsComments(\n writer,\n unassociatedMessage.formatMessageWithLocation(collector.workingPackage.packageFolder)\n );\n }\n }\n\n if (collector.workingPackage.tsdocComment === undefined) {\n writer.ensureSkippedLine();\n ApiReportGenerator._writeLineAsComments(writer, '(No @packageDocumentation comment for this package)');\n }\n\n // Write the closing delimiter for the Markdown code fence\n writer.ensureSkippedLine();\n writer.writeLine('```');\n\n // Remove any trailing spaces\n return writer.toString().replace(ApiReportGenerator._trimSpacesRegExp, '');\n }\n\n /**\n * Before writing out a declaration, _modifySpan() applies various fixups to make it nice.\n */\n private static _modifySpan(\n collector: Collector,\n span: Span,\n entity: CollectorEntity,\n astDeclaration: AstDeclaration,\n insideTypeLiteral: boolean\n ): void {\n // Should we process this declaration at all?\n // eslint-disable-next-line no-bitwise\n if ((astDeclaration.modifierFlags & ts.ModifierFlags.Private) !== 0) {\n span.modification.skipAll();\n return;\n }\n\n const previousSpan: Span | undefined = span.previousSibling;\n\n let recurseChildren: boolean = true;\n let sortChildren: boolean = false;\n\n switch (span.kind) {\n case ts.SyntaxKind.JSDocComment:\n span.modification.skipAll();\n // For now, we don't transform JSDoc comment nodes at all\n recurseChildren = false;\n break;\n\n case ts.SyntaxKind.ExportKeyword:\n case ts.SyntaxKind.DefaultKeyword:\n case ts.SyntaxKind.DeclareKeyword:\n // Delete any explicit \"export\" or \"declare\" keywords -- we will re-add them below\n span.modification.skipAll();\n break;\n\n case ts.SyntaxKind.InterfaceKeyword:\n case ts.SyntaxKind.ClassKeyword:\n case ts.SyntaxKind.EnumKeyword:\n case ts.SyntaxKind.NamespaceKeyword:\n case ts.SyntaxKind.ModuleKeyword:\n case ts.SyntaxKind.TypeKeyword:\n case ts.SyntaxKind.FunctionKeyword:\n // Replace the stuff we possibly deleted above\n let replacedModifiers: string = '';\n\n if (entity.shouldInlineExport) {\n replacedModifiers = 'export ' + replacedModifiers;\n }\n\n if (previousSpan && previousSpan.kind === ts.SyntaxKind.SyntaxList) {\n // If there is a previous span of type SyntaxList, then apply it before any other modifiers\n // (e.g. \"abstract\") that appear there.\n previousSpan.modification.prefix = replacedModifiers + previousSpan.modification.prefix;\n } else {\n // Otherwise just stick it in front of this span\n span.modification.prefix = replacedModifiers + span.modification.prefix;\n }\n break;\n\n case ts.SyntaxKind.SyntaxList:\n if (span.parent) {\n if (AstDeclaration.isSupportedSyntaxKind(span.parent.kind)) {\n // If the immediate parent is an API declaration, and the immediate children are API declarations,\n // then sort the children alphabetically\n sortChildren = true;\n } else if (span.parent.kind === ts.SyntaxKind.ModuleBlock) {\n // Namespaces are special because their chain goes ModuleDeclaration -> ModuleBlock -> SyntaxList\n sortChildren = true;\n }\n }\n break;\n\n case ts.SyntaxKind.VariableDeclaration:\n if (!span.parent) {\n // The VariableDeclaration node is part of a VariableDeclarationList, however\n // the Entry.followedSymbol points to the VariableDeclaration part because\n // multiple definitions might share the same VariableDeclarationList.\n //\n // Since we are emitting a separate declaration for each one, we need to look upwards\n // in the ts.Node tree and write a copy of the enclosing VariableDeclarationList\n // content (e.g. \"var\" from \"var x=1, y=2\").\n const list: ts.VariableDeclarationList | undefined = TypeScriptHelpers.matchAncestor(span.node, [\n ts.SyntaxKind.VariableDeclarationList,\n ts.SyntaxKind.VariableDeclaration\n ]);\n if (!list) {\n // This should not happen unless the compiler API changes somehow\n throw new InternalError('Unsupported variable declaration');\n }\n const listPrefix: string = list\n .getSourceFile()\n .text.substring(list.getStart(), list.declarations[0].getStart());\n span.modification.prefix = listPrefix + span.modification.prefix;\n span.modification.suffix = ';';\n\n if (entity.shouldInlineExport) {\n span.modification.prefix = 'export ' + span.modification.prefix;\n }\n }\n break;\n\n case ts.SyntaxKind.Identifier:\n const referencedEntity: CollectorEntity | undefined = collector.tryGetEntityForNode(\n span.node as ts.Identifier\n );\n\n if (referencedEntity) {\n if (!referencedEntity.nameForEmit) {\n // This should never happen\n throw new InternalError('referencedEntry.nameForEmit is undefined');\n }\n\n span.modification.prefix = referencedEntity.nameForEmit;\n // For debugging:\n // span.modification.prefix += '/*R=FIX*/';\n } else {\n // For debugging:\n // span.modification.prefix += '/*R=KEEP*/';\n }\n\n break;\n\n case ts.SyntaxKind.TypeLiteral:\n insideTypeLiteral = true;\n break;\n\n case ts.SyntaxKind.ImportType:\n DtsEmitHelpers.modifyImportTypeSpan(\n collector,\n span,\n astDeclaration,\n (childSpan, childAstDeclaration) => {\n ApiReportGenerator._modifySpan(\n collector,\n childSpan,\n entity,\n childAstDeclaration,\n insideTypeLiteral\n );\n }\n );\n break;\n }\n\n if (recurseChildren) {\n for (const child of span.children) {\n let childAstDeclaration: AstDeclaration = astDeclaration;\n\n if (AstDeclaration.isSupportedSyntaxKind(child.kind)) {\n childAstDeclaration = collector.astSymbolTable.getChildAstDeclarationByNode(\n child.node,\n astDeclaration\n );\n\n if (sortChildren) {\n span.modification.sortChildren = true;\n child.modification.sortKey = Collector.getSortKeyIgnoringUnderscore(\n childAstDeclaration.astSymbol.localName\n );\n }\n\n if (!insideTypeLiteral) {\n const messagesToReport: ExtractorMessage[] =\n collector.messageRouter.fetchAssociatedMessagesForReviewFile(childAstDeclaration);\n const aedocSynopsis: string = ApiReportGenerator._getAedocSynopsis(\n collector,\n childAstDeclaration,\n messagesToReport\n );\n\n child.modification.prefix = aedocSynopsis + child.modification.prefix;\n }\n }\n\n ApiReportGenerator._modifySpan(collector, child, entity, childAstDeclaration, insideTypeLiteral);\n }\n }\n }\n\n /**\n * For declarations marked as `@preapproved`, this is used instead of _modifySpan().\n */\n private static _modifySpanForPreapproved(span: Span): void {\n // Match something like this:\n //\n // ClassDeclaration:\n // SyntaxList:\n // ExportKeyword: pre=[export] sep=[ ]\n // DeclareKeyword: pre=[declare] sep=[ ]\n // ClassKeyword: pre=[class] sep=[ ]\n // Identifier: pre=[_PreapprovedClass] sep=[ ]\n // FirstPunctuation: pre=[{] sep=[\\n\\n ]\n // SyntaxList:\n // ...\n // CloseBraceToken: pre=[}]\n //\n // or this:\n // ModuleDeclaration:\n // SyntaxList:\n // ExportKeyword: pre=[export] sep=[ ]\n // DeclareKeyword: pre=[declare] sep=[ ]\n // NamespaceKeyword: pre=[namespace] sep=[ ]\n // Identifier: pre=[_PreapprovedNamespace] sep=[ ]\n // ModuleBlock:\n // FirstPunctuation: pre=[{] sep=[\\n\\n ]\n // SyntaxList:\n // ...\n // CloseBraceToken: pre=[}]\n //\n // And reduce it to something like this:\n //\n // // @internal (undocumented)\n // class _PreapprovedClass { /* (preapproved) */ }\n //\n\n let skipRest: boolean = false;\n for (const child of span.children) {\n if (skipRest || child.kind === ts.SyntaxKind.SyntaxList || child.kind === ts.SyntaxKind.JSDocComment) {\n child.modification.skipAll();\n }\n if (child.kind === ts.SyntaxKind.Identifier) {\n skipRest = true;\n child.modification.omitSeparatorAfter = true;\n child.modification.suffix = ' { /* (preapproved) */ }';\n }\n }\n }\n\n /**\n * Writes a synopsis of the AEDoc comments, which indicates the release tag,\n * whether the item has been documented, and any warnings that were detected\n * by the analysis.\n */\n private static _getAedocSynopsis(\n collector: Collector,\n astDeclaration: AstDeclaration,\n messagesToReport: ExtractorMessage[]\n ): string {\n const writer: IndentedWriter = new IndentedWriter();\n\n for (const message of messagesToReport) {\n ApiReportGenerator._writeLineAsComments(writer, 'Warning: ' + message.formatMessageWithoutLocation());\n }\n\n if (!collector.isAncillaryDeclaration(astDeclaration)) {\n const footerParts: string[] = [];\n const apiItemMetadata: ApiItemMetadata = collector.fetchApiItemMetadata(astDeclaration);\n if (!apiItemMetadata.releaseTagSameAsParent) {\n if (apiItemMetadata.effectiveReleaseTag !== ReleaseTag.None) {\n footerParts.push(ReleaseTag.getTagName(apiItemMetadata.effectiveReleaseTag));\n }\n }\n\n if (apiItemMetadata.isSealed) {\n footerParts.push('@sealed');\n }\n\n if (apiItemMetadata.isVirtual) {\n footerParts.push('@virtual');\n }\n\n if (apiItemMetadata.isOverride) {\n footerParts.push('@override');\n }\n\n if (apiItemMetadata.isEventProperty) {\n footerParts.push('@eventProperty');\n }\n\n if (apiItemMetadata.tsdocComment) {\n if (apiItemMetadata.tsdocComment.deprecatedBlock) {\n footerParts.push('@deprecated');\n }\n }\n\n if (apiItemMetadata.needsDocumentation) {\n footerParts.push('(undocumented)');\n }\n\n if (footerParts.length > 0) {\n if (messagesToReport.length > 0) {\n ApiReportGenerator._writeLineAsComments(writer, ''); // skip a line after the warnings\n }\n\n ApiReportGenerator._writeLineAsComments(writer, footerParts.join(' '));\n }\n }\n\n return writer.toString();\n }\n\n private static _writeLineAsComments(writer: IndentedWriter, line: string): void {\n const lines: string[] = Text.convertToLf(line).split('\\n');\n for (const realLine of lines) {\n writer.write('// ');\n writer.write(realLine);\n writer.writeLine();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ApiReportGenerator.js","sourceRoot":"","sources":["../../src/generators/ApiReportGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport * as ts from 'typescript';\nimport { Text, InternalError } from '@rushstack/node-core-library';\nimport { ReleaseTag } from '@microsoft/api-extractor-model';\n\nimport { Collector } from '../collector/Collector';\nimport { TypeScriptHelpers } from '../analyzer/TypeScriptHelpers';\nimport { Span } from '../analyzer/Span';\nimport { CollectorEntity } from '../collector/CollectorEntity';\nimport { AstDeclaration } from '../analyzer/AstDeclaration';\nimport { ApiItemMetadata } from '../collector/ApiItemMetadata';\nimport { AstImport } from '../analyzer/AstImport';\nimport { AstSymbol } from '../analyzer/AstSymbol';\nimport { ExtractorMessage } from '../api/ExtractorMessage';\nimport { IndentedWriter } from './IndentedWriter';\nimport { DtsEmitHelpers } from './DtsEmitHelpers';\nimport { AstNamespaceImport } from '../analyzer/AstNamespaceImport';\nimport { AstEntity } from '../analyzer/AstEntity';\nimport { AstModuleExportInfo } from '../analyzer/AstModule';\nimport { SourceFileLocationFormatter } from '../analyzer/SourceFileLocationFormatter';\n\nexport class ApiReportGenerator {\n private static _trimSpacesRegExp: RegExp = / +$/gm;\n\n /**\n * Compares the contents of two API files that were created using ApiFileGenerator,\n * and returns true if they are equivalent. Note that these files are not normally edited\n * by a human; the \"equivalence\" comparison here is intended to ignore spurious changes that\n * might be introduced by a tool, e.g. Git newline normalization or an editor that strips\n * whitespace when saving.\n */\n public static areEquivalentApiFileContents(\n actualFileContent: string,\n expectedFileContent: string\n ): boolean {\n // NOTE: \"\\s\" also matches \"\\r\" and \"\\n\"\n const normalizedActual: string = actualFileContent.replace(/[\\s]+/g, ' ');\n const normalizedExpected: string = expectedFileContent.replace(/[\\s]+/g, ' ');\n return normalizedActual === normalizedExpected;\n }\n\n public static generateReviewFileContent(collector: Collector): string {\n const writer: IndentedWriter = new IndentedWriter();\n writer.trimLeadingSpaces = true;\n\n writer.writeLine(\n [\n `## API Report File for \"${collector.workingPackage.name}\"`,\n ``,\n `> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/).`,\n ``\n ].join('\\n')\n );\n\n // Write the opening delimiter for the Markdown code fence\n writer.writeLine('```ts\\n');\n\n // Emit the triple slash directives\n for (const typeDirectiveReference of Array.from(collector.dtsTypeReferenceDirectives).sort()) {\n // https://github.com/microsoft/TypeScript/blob/611ebc7aadd7a44a4c0447698bfda9222a78cb66/src/compiler/declarationEmitter.ts#L162\n writer.writeLine(`/// <reference types=\"${typeDirectiveReference}\" />`);\n }\n for (const libDirectiveReference of Array.from(collector.dtsLibReferenceDirectives).sort()) {\n writer.writeLine(`/// <reference lib=\"${libDirectiveReference}\" />`);\n }\n writer.ensureSkippedLine();\n\n // Emit the imports\n for (const entity of collector.entities) {\n if (entity.astEntity instanceof AstImport) {\n DtsEmitHelpers.emitImport(writer, entity, entity.astEntity);\n }\n }\n writer.ensureSkippedLine();\n\n // Emit the regular declarations\n for (const entity of collector.entities) {\n const astEntity: AstEntity = entity.astEntity;\n if (entity.consumable || collector.extractorConfig.apiReportIncludeForgottenExports) {\n // First, collect the list of export names for this symbol. When reporting messages with\n // ExtractorMessage.properties.exportName, this will enable us to emit the warning comments alongside\n // the associated export statement.\n interface IExportToEmit {\n readonly exportName: string;\n readonly associatedMessages: ExtractorMessage[];\n }\n const exportsToEmit: Map<string, IExportToEmit> = new Map<string, IExportToEmit>();\n\n for (const exportName of entity.exportNames) {\n if (!entity.shouldInlineExport) {\n exportsToEmit.set(exportName, { exportName, associatedMessages: [] });\n }\n }\n\n if (astEntity instanceof AstSymbol) {\n // Emit all the declarations for this entity\n for (const astDeclaration of astEntity.astDeclarations || []) {\n // Get the messages associated with this declaration\n const fetchedMessages: ExtractorMessage[] =\n collector.messageRouter.fetchAssociatedMessagesForReviewFile(astDeclaration);\n\n // Peel off the messages associated with an export statement and store them\n // in IExportToEmit.associatedMessages (to be processed later). The remaining messages will\n // added to messagesToReport, to be emitted next to the declaration instead of the export statement.\n const messagesToReport: ExtractorMessage[] = [];\n for (const message of fetchedMessages) {\n if (message.properties.exportName) {\n const exportToEmit: IExportToEmit | undefined = exportsToEmit.get(\n message.properties.exportName\n );\n if (exportToEmit) {\n exportToEmit.associatedMessages.push(message);\n continue;\n }\n }\n messagesToReport.push(message);\n }\n\n writer.ensureSkippedLine();\n writer.write(ApiReportGenerator._getAedocSynopsis(collector, astDeclaration, messagesToReport));\n\n const span: Span = new Span(astDeclaration.declaration);\n\n const apiItemMetadata: ApiItemMetadata = collector.fetchApiItemMetadata(astDeclaration);\n if (apiItemMetadata.isPreapproved) {\n ApiReportGenerator._modifySpanForPreapproved(span);\n } else {\n ApiReportGenerator._modifySpan(collector, span, entity, astDeclaration, false);\n }\n\n span.writeModifiedText(writer);\n writer.ensureNewLine();\n }\n }\n\n if (astEntity instanceof AstNamespaceImport) {\n const astModuleExportInfo: AstModuleExportInfo = astEntity.fetchAstModuleExportInfo(collector);\n\n if (entity.nameForEmit === undefined) {\n // This should never happen\n throw new InternalError('referencedEntry.nameForEmit is undefined');\n }\n\n if (astModuleExportInfo.starExportedExternalModules.size > 0) {\n // We could support this, but we would need to find a way to safely represent it.\n throw new Error(\n `The ${entity.nameForEmit} namespace import includes a star export, which is not supported:\\n` +\n SourceFileLocationFormatter.formatDeclaration(astEntity.declaration)\n );\n }\n\n // Emit a synthetic declaration for the namespace. It will look like this:\n //\n // declare namespace example {\n // export {\n // f1,\n // f2\n // }\n // }\n //\n // Note that we do not try to relocate f1()/f2() to be inside the namespace because other type\n // signatures may reference them directly (without using the namespace qualifier).\n\n writer.ensureSkippedLine();\n writer.writeLine(`declare namespace ${entity.nameForEmit} {`);\n\n // all local exports of local imported module are just references to top-level declarations\n writer.increaseIndent();\n writer.writeLine('export {');\n writer.increaseIndent();\n\n const exportClauses: string[] = [];\n for (const [exportedName, exportedEntity] of astModuleExportInfo.exportedLocalEntities) {\n const collectorEntity: CollectorEntity | undefined =\n collector.tryGetCollectorEntity(exportedEntity);\n if (collectorEntity === undefined) {\n // This should never happen\n // top-level exports of local imported module should be added as collector entities before\n throw new InternalError(\n `Cannot find collector entity for ${entity.nameForEmit}.${exportedEntity.localName}`\n );\n }\n\n if (collectorEntity.nameForEmit === exportedName) {\n exportClauses.push(collectorEntity.nameForEmit);\n } else {\n exportClauses.push(`${collectorEntity.nameForEmit} as ${exportedName}`);\n }\n }\n writer.writeLine(exportClauses.join(',\\n'));\n\n writer.decreaseIndent();\n writer.writeLine('}'); // end of \"export { ... }\"\n writer.decreaseIndent();\n writer.writeLine('}'); // end of \"declare namespace { ... }\"\n }\n\n // Now emit the export statements for this entity.\n for (const exportToEmit of exportsToEmit.values()) {\n // Write any associated messages\n if (exportToEmit.associatedMessages.length > 0) {\n writer.ensureSkippedLine();\n for (const message of exportToEmit.associatedMessages) {\n ApiReportGenerator._writeLineAsComments(\n writer,\n 'Warning: ' + message.formatMessageWithoutLocation()\n );\n }\n }\n\n DtsEmitHelpers.emitNamedExport(writer, exportToEmit.exportName, entity);\n }\n writer.ensureSkippedLine();\n }\n }\n\n DtsEmitHelpers.emitStarExports(writer, collector);\n\n // Write the unassociated warnings at the bottom of the file\n const unassociatedMessages: ExtractorMessage[] =\n collector.messageRouter.fetchUnassociatedMessagesForReviewFile();\n if (unassociatedMessages.length > 0) {\n writer.ensureSkippedLine();\n ApiReportGenerator._writeLineAsComments(writer, 'Warnings were encountered during analysis:');\n ApiReportGenerator._writeLineAsComments(writer, '');\n for (const unassociatedMessage of unassociatedMessages) {\n ApiReportGenerator._writeLineAsComments(\n writer,\n unassociatedMessage.formatMessageWithLocation(collector.workingPackage.packageFolder)\n );\n }\n }\n\n if (collector.workingPackage.tsdocComment === undefined) {\n writer.ensureSkippedLine();\n ApiReportGenerator._writeLineAsComments(writer, '(No @packageDocumentation comment for this package)');\n }\n\n // Write the closing delimiter for the Markdown code fence\n writer.ensureSkippedLine();\n writer.writeLine('```');\n\n // Remove any trailing spaces\n return writer.toString().replace(ApiReportGenerator._trimSpacesRegExp, '');\n }\n\n /**\n * Before writing out a declaration, _modifySpan() applies various fixups to make it nice.\n */\n private static _modifySpan(\n collector: Collector,\n span: Span,\n entity: CollectorEntity,\n astDeclaration: AstDeclaration,\n insideTypeLiteral: boolean\n ): void {\n // Should we process this declaration at all?\n // eslint-disable-next-line no-bitwise\n if ((astDeclaration.modifierFlags & ts.ModifierFlags.Private) !== 0) {\n span.modification.skipAll();\n return;\n }\n\n const previousSpan: Span | undefined = span.previousSibling;\n\n let recurseChildren: boolean = true;\n let sortChildren: boolean = false;\n\n switch (span.kind) {\n case ts.SyntaxKind.JSDocComment:\n span.modification.skipAll();\n // For now, we don't transform JSDoc comment nodes at all\n recurseChildren = false;\n break;\n\n case ts.SyntaxKind.ExportKeyword:\n case ts.SyntaxKind.DefaultKeyword:\n case ts.SyntaxKind.DeclareKeyword:\n // Delete any explicit \"export\" or \"declare\" keywords -- we will re-add them below\n span.modification.skipAll();\n break;\n\n case ts.SyntaxKind.InterfaceKeyword:\n case ts.SyntaxKind.ClassKeyword:\n case ts.SyntaxKind.EnumKeyword:\n case ts.SyntaxKind.NamespaceKeyword:\n case ts.SyntaxKind.ModuleKeyword:\n case ts.SyntaxKind.TypeKeyword:\n case ts.SyntaxKind.FunctionKeyword:\n // Replace the stuff we possibly deleted above\n let replacedModifiers: string = '';\n\n if (entity.shouldInlineExport) {\n replacedModifiers = 'export ' + replacedModifiers;\n }\n\n if (previousSpan && previousSpan.kind === ts.SyntaxKind.SyntaxList) {\n // If there is a previous span of type SyntaxList, then apply it before any other modifiers\n // (e.g. \"abstract\") that appear there.\n previousSpan.modification.prefix = replacedModifiers + previousSpan.modification.prefix;\n } else {\n // Otherwise just stick it in front of this span\n span.modification.prefix = replacedModifiers + span.modification.prefix;\n }\n break;\n\n case ts.SyntaxKind.SyntaxList:\n if (span.parent) {\n if (AstDeclaration.isSupportedSyntaxKind(span.parent.kind)) {\n // If the immediate parent is an API declaration, and the immediate children are API declarations,\n // then sort the children alphabetically\n sortChildren = true;\n } else if (span.parent.kind === ts.SyntaxKind.ModuleBlock) {\n // Namespaces are special because their chain goes ModuleDeclaration -> ModuleBlock -> SyntaxList\n sortChildren = true;\n }\n }\n break;\n\n case ts.SyntaxKind.VariableDeclaration:\n if (!span.parent) {\n // The VariableDeclaration node is part of a VariableDeclarationList, however\n // the Entry.followedSymbol points to the VariableDeclaration part because\n // multiple definitions might share the same VariableDeclarationList.\n //\n // Since we are emitting a separate declaration for each one, we need to look upwards\n // in the ts.Node tree and write a copy of the enclosing VariableDeclarationList\n // content (e.g. \"var\" from \"var x=1, y=2\").\n const list: ts.VariableDeclarationList | undefined = TypeScriptHelpers.matchAncestor(span.node, [\n ts.SyntaxKind.VariableDeclarationList,\n ts.SyntaxKind.VariableDeclaration\n ]);\n if (!list) {\n // This should not happen unless the compiler API changes somehow\n throw new InternalError('Unsupported variable declaration');\n }\n const listPrefix: string = list\n .getSourceFile()\n .text.substring(list.getStart(), list.declarations[0].getStart());\n span.modification.prefix = listPrefix + span.modification.prefix;\n span.modification.suffix = ';';\n\n if (entity.shouldInlineExport) {\n span.modification.prefix = 'export ' + span.modification.prefix;\n }\n }\n break;\n\n case ts.SyntaxKind.Identifier:\n const referencedEntity: CollectorEntity | undefined = collector.tryGetEntityForNode(\n span.node as ts.Identifier\n );\n\n if (referencedEntity) {\n if (!referencedEntity.nameForEmit) {\n // This should never happen\n throw new InternalError('referencedEntry.nameForEmit is undefined');\n }\n\n span.modification.prefix = referencedEntity.nameForEmit;\n // For debugging:\n // span.modification.prefix += '/*R=FIX*/';\n } else {\n // For debugging:\n // span.modification.prefix += '/*R=KEEP*/';\n }\n\n break;\n\n case ts.SyntaxKind.TypeLiteral:\n insideTypeLiteral = true;\n break;\n\n case ts.SyntaxKind.ImportType:\n DtsEmitHelpers.modifyImportTypeSpan(\n collector,\n span,\n astDeclaration,\n (childSpan, childAstDeclaration) => {\n ApiReportGenerator._modifySpan(\n collector,\n childSpan,\n entity,\n childAstDeclaration,\n insideTypeLiteral\n );\n }\n );\n break;\n }\n\n if (recurseChildren) {\n for (const child of span.children) {\n let childAstDeclaration: AstDeclaration = astDeclaration;\n\n if (AstDeclaration.isSupportedSyntaxKind(child.kind)) {\n childAstDeclaration = collector.astSymbolTable.getChildAstDeclarationByNode(\n child.node,\n astDeclaration\n );\n\n if (sortChildren) {\n span.modification.sortChildren = true;\n child.modification.sortKey = Collector.getSortKeyIgnoringUnderscore(\n childAstDeclaration.astSymbol.localName\n );\n }\n\n if (!insideTypeLiteral) {\n const messagesToReport: ExtractorMessage[] =\n collector.messageRouter.fetchAssociatedMessagesForReviewFile(childAstDeclaration);\n const aedocSynopsis: string = ApiReportGenerator._getAedocSynopsis(\n collector,\n childAstDeclaration,\n messagesToReport\n );\n\n child.modification.prefix = aedocSynopsis + child.modification.prefix;\n }\n }\n\n ApiReportGenerator._modifySpan(collector, child, entity, childAstDeclaration, insideTypeLiteral);\n }\n }\n }\n\n /**\n * For declarations marked as `@preapproved`, this is used instead of _modifySpan().\n */\n private static _modifySpanForPreapproved(span: Span): void {\n // Match something like this:\n //\n // ClassDeclaration:\n // SyntaxList:\n // ExportKeyword: pre=[export] sep=[ ]\n // DeclareKeyword: pre=[declare] sep=[ ]\n // ClassKeyword: pre=[class] sep=[ ]\n // Identifier: pre=[_PreapprovedClass] sep=[ ]\n // FirstPunctuation: pre=[{] sep=[\\n\\n ]\n // SyntaxList:\n // ...\n // CloseBraceToken: pre=[}]\n //\n // or this:\n // ModuleDeclaration:\n // SyntaxList:\n // ExportKeyword: pre=[export] sep=[ ]\n // DeclareKeyword: pre=[declare] sep=[ ]\n // NamespaceKeyword: pre=[namespace] sep=[ ]\n // Identifier: pre=[_PreapprovedNamespace] sep=[ ]\n // ModuleBlock:\n // FirstPunctuation: pre=[{] sep=[\\n\\n ]\n // SyntaxList:\n // ...\n // CloseBraceToken: pre=[}]\n //\n // And reduce it to something like this:\n //\n // // @internal (undocumented)\n // class _PreapprovedClass { /* (preapproved) */ }\n //\n\n let skipRest: boolean = false;\n for (const child of span.children) {\n if (skipRest || child.kind === ts.SyntaxKind.SyntaxList || child.kind === ts.SyntaxKind.JSDocComment) {\n child.modification.skipAll();\n }\n if (child.kind === ts.SyntaxKind.Identifier) {\n skipRest = true;\n child.modification.omitSeparatorAfter = true;\n child.modification.suffix = ' { /* (preapproved) */ }';\n }\n }\n }\n\n /**\n * Writes a synopsis of the AEDoc comments, which indicates the release tag,\n * whether the item has been documented, and any warnings that were detected\n * by the analysis.\n */\n private static _getAedocSynopsis(\n collector: Collector,\n astDeclaration: AstDeclaration,\n messagesToReport: ExtractorMessage[]\n ): string {\n const writer: IndentedWriter = new IndentedWriter();\n\n for (const message of messagesToReport) {\n ApiReportGenerator._writeLineAsComments(writer, 'Warning: ' + message.formatMessageWithoutLocation());\n }\n\n if (!collector.isAncillaryDeclaration(astDeclaration)) {\n const footerParts: string[] = [];\n const apiItemMetadata: ApiItemMetadata = collector.fetchApiItemMetadata(astDeclaration);\n if (!apiItemMetadata.releaseTagSameAsParent) {\n if (apiItemMetadata.effectiveReleaseTag !== ReleaseTag.None) {\n footerParts.push(ReleaseTag.getTagName(apiItemMetadata.effectiveReleaseTag));\n }\n }\n\n if (apiItemMetadata.isSealed) {\n footerParts.push('@sealed');\n }\n\n if (apiItemMetadata.isVirtual) {\n footerParts.push('@virtual');\n }\n\n if (apiItemMetadata.isOverride) {\n footerParts.push('@override');\n }\n\n if (apiItemMetadata.isEventProperty) {\n footerParts.push('@eventProperty');\n }\n\n if (apiItemMetadata.tsdocComment) {\n if (apiItemMetadata.tsdocComment.deprecatedBlock) {\n footerParts.push('@deprecated');\n }\n }\n\n if (apiItemMetadata.needsDocumentation) {\n footerParts.push('(undocumented)');\n }\n\n if (footerParts.length > 0) {\n if (messagesToReport.length > 0) {\n ApiReportGenerator._writeLineAsComments(writer, ''); // skip a line after the warnings\n }\n\n ApiReportGenerator._writeLineAsComments(writer, footerParts.join(' '));\n }\n }\n\n return writer.toString();\n }\n\n private static _writeLineAsComments(writer: IndentedWriter, line: string): void {\n const lines: string[] = Text.convertToLf(line).split('\\n');\n for (const realLine of lines) {\n writer.write('// ');\n writer.write(realLine);\n writer.writeLine();\n }\n }\n}\n"]}
@@ -314,6 +314,6 @@ class DeclarationReferenceGenerator {
314
314
  return DeclarationReference_1.GlobalSource.instance;
315
315
  }
316
316
  }
317
- exports.DeclarationReferenceGenerator = DeclarationReferenceGenerator;
318
317
  DeclarationReferenceGenerator.unknownReference = '?';
318
+ exports.DeclarationReferenceGenerator = DeclarationReferenceGenerator;
319
319
  //# sourceMappingURL=DeclarationReferenceGenerator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DeclarationReferenceGenerator.js","sourceRoot":"","sources":["../../src/generators/DeclarationReferenceGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/* eslint-disable no-bitwise */\nimport * as ts from 'typescript';\nimport {\n DeclarationReference,\n ModuleSource,\n GlobalSource,\n Navigation,\n Meaning\n} from '@microsoft/tsdoc/lib-commonjs/beta/DeclarationReference';\nimport { INodePackageJson, InternalError } from '@rushstack/node-core-library';\nimport { TypeScriptHelpers } from '../analyzer/TypeScriptHelpers';\nimport { TypeScriptInternals } from '../analyzer/TypeScriptInternals';\nimport { Collector } from '../collector/Collector';\nimport { CollectorEntity } from '../collector/CollectorEntity';\nimport { AstNamespaceImport } from '../analyzer/AstNamespaceImport';\n\nexport class DeclarationReferenceGenerator {\n public static readonly unknownReference: string = '?';\n\n private _collector: Collector;\n\n public constructor(collector: Collector) {\n this._collector = collector;\n }\n\n /**\n * Gets the UID for a TypeScript Identifier that references a type.\n */\n public getDeclarationReferenceForIdentifier(node: ts.Identifier): DeclarationReference | undefined {\n const symbol: ts.Symbol | undefined = this._collector.typeChecker.getSymbolAtLocation(node);\n if (symbol !== undefined) {\n const isExpression: boolean = DeclarationReferenceGenerator._isInExpressionContext(node);\n return (\n this.getDeclarationReferenceForSymbol(\n symbol,\n isExpression ? ts.SymbolFlags.Value : ts.SymbolFlags.Type\n ) ||\n this.getDeclarationReferenceForSymbol(\n symbol,\n isExpression ? ts.SymbolFlags.Type : ts.SymbolFlags.Value\n ) ||\n this.getDeclarationReferenceForSymbol(symbol, ts.SymbolFlags.Namespace)\n );\n }\n }\n\n /**\n * Gets the DeclarationReference for a TypeScript Symbol for a given meaning.\n */\n public getDeclarationReferenceForSymbol(\n symbol: ts.Symbol,\n meaning: ts.SymbolFlags\n ): DeclarationReference | undefined {\n return this._symbolToDeclarationReference(symbol, meaning, /*includeModuleSymbols*/ false);\n }\n\n private static _isInExpressionContext(node: ts.Node): boolean {\n switch (node.parent.kind) {\n case ts.SyntaxKind.TypeQuery:\n case ts.SyntaxKind.ComputedPropertyName:\n return true;\n case ts.SyntaxKind.QualifiedName:\n return DeclarationReferenceGenerator._isInExpressionContext(node.parent);\n default:\n return false;\n }\n }\n\n private static _isExternalModuleSymbol(symbol: ts.Symbol): boolean {\n return (\n !!(symbol.flags & ts.SymbolFlags.ValueModule) &&\n symbol.valueDeclaration !== undefined &&\n ts.isSourceFile(symbol.valueDeclaration)\n );\n }\n\n private static _isSameSymbol(left: ts.Symbol | undefined, right: ts.Symbol): boolean {\n return (\n left === right ||\n !!(\n left &&\n left.valueDeclaration &&\n right.valueDeclaration &&\n left.valueDeclaration === right.valueDeclaration\n )\n );\n }\n\n private _getNavigationToSymbol(symbol: ts.Symbol): Navigation {\n const declaration: ts.Declaration | undefined = TypeScriptHelpers.tryGetADeclaration(symbol);\n const sourceFile: ts.SourceFile | undefined = declaration?.getSourceFile();\n const parent: ts.Symbol | undefined = TypeScriptInternals.getSymbolParent(symbol);\n\n // If it's global or from an external library, then use either Members or Exports. It's not possible for\n // global symbols or external library symbols to be Locals.\n const isGlobal: boolean = !!sourceFile && !ts.isExternalModule(sourceFile);\n const isFromExternalLibrary: boolean =\n !!sourceFile && this._collector.program.isSourceFileFromExternalLibrary(sourceFile);\n if (isGlobal || isFromExternalLibrary) {\n if (\n parent &&\n parent.members &&\n DeclarationReferenceGenerator._isSameSymbol(parent.members.get(symbol.escapedName), symbol)\n ) {\n return Navigation.Members;\n }\n\n return Navigation.Exports;\n }\n\n // Otherwise, this symbol is from the current package. If we've found an associated consumable\n // `CollectorEntity`, then use Exports. We use `consumable` here instead of `exported` because\n // if the symbol is exported from a non-consumable `AstNamespaceImport`, we don't want to use\n // Exports. We should use Locals instead.\n const entity: CollectorEntity | undefined = this._collector.tryGetEntityForSymbol(symbol);\n if (entity?.consumable) {\n return Navigation.Exports;\n }\n\n // If its parent symbol is not a source file, then use either Exports or Members. If the parent symbol\n // is a source file, but it wasn't exported from the package entry point (in the check above), then the\n // symbol is a local, so fall through below.\n if (parent && !DeclarationReferenceGenerator._isExternalModuleSymbol(parent)) {\n if (\n parent.members &&\n DeclarationReferenceGenerator._isSameSymbol(parent.members.get(symbol.escapedName), symbol)\n ) {\n return Navigation.Members;\n }\n\n return Navigation.Exports;\n }\n\n // Otherwise, we have a local symbol, so use a Locals navigation. These are either:\n //\n // 1. Symbols that are exported from a file module but not the package entry point.\n // 2. Symbols that are not exported from their parent module.\n return Navigation.Locals;\n }\n\n private static _getMeaningOfSymbol(symbol: ts.Symbol, meaning: ts.SymbolFlags): Meaning | undefined {\n if (symbol.flags & meaning & ts.SymbolFlags.Class) {\n return Meaning.Class;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Enum) {\n return Meaning.Enum;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Interface) {\n return Meaning.Interface;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.TypeAlias) {\n return Meaning.TypeAlias;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Function) {\n return Meaning.Function;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Variable) {\n return Meaning.Variable;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Module) {\n return Meaning.Namespace;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.ClassMember) {\n return Meaning.Member;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Constructor) {\n return Meaning.Constructor;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.EnumMember) {\n return Meaning.Member;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Signature) {\n if (symbol.escapedName === ts.InternalSymbolName.Call) {\n return Meaning.CallSignature;\n }\n if (symbol.escapedName === ts.InternalSymbolName.New) {\n return Meaning.ConstructSignature;\n }\n if (symbol.escapedName === ts.InternalSymbolName.Index) {\n return Meaning.IndexSignature;\n }\n }\n if (symbol.flags & meaning & ts.SymbolFlags.TypeParameter) {\n // This should have already been handled in `getDeclarationReferenceOfSymbol`.\n throw new InternalError('Not supported.');\n }\n return undefined;\n }\n\n private _symbolToDeclarationReference(\n symbol: ts.Symbol,\n meaning: ts.SymbolFlags,\n includeModuleSymbols: boolean\n ): DeclarationReference | undefined {\n const declaration: ts.Node | undefined = TypeScriptHelpers.tryGetADeclaration(symbol);\n const sourceFile: ts.SourceFile | undefined = declaration?.getSourceFile();\n\n let followedSymbol: ts.Symbol = symbol;\n if (followedSymbol.flags & ts.SymbolFlags.ExportValue) {\n followedSymbol = this._collector.typeChecker.getExportSymbolOfSymbol(followedSymbol);\n }\n if (followedSymbol.flags & ts.SymbolFlags.Alias) {\n followedSymbol = this._collector.typeChecker.getAliasedSymbol(followedSymbol);\n\n // Without this logic, we end up following the symbol `ns` in `import * as ns from './file'` to\n // the actual file `file.ts`. We don't want to do this, so revert to the original symbol.\n if (followedSymbol.flags & ts.SymbolFlags.ValueModule) {\n followedSymbol = symbol;\n }\n }\n\n if (DeclarationReferenceGenerator._isExternalModuleSymbol(followedSymbol)) {\n if (!includeModuleSymbols) {\n return undefined;\n }\n return new DeclarationReference(this._sourceFileToModuleSource(sourceFile));\n }\n\n // Do not generate a declaration reference for a type parameter.\n if (followedSymbol.flags & ts.SymbolFlags.TypeParameter) {\n return undefined;\n }\n\n let parentRef: DeclarationReference | undefined = this._getParentReference(followedSymbol);\n if (!parentRef) {\n return undefined;\n }\n\n let localName: string = followedSymbol.name;\n const entity: CollectorEntity | undefined = this._collector.tryGetEntityForSymbol(followedSymbol);\n if (entity?.nameForEmit) {\n localName = entity.nameForEmit;\n }\n\n if (followedSymbol.escapedName === ts.InternalSymbolName.Constructor) {\n localName = 'constructor';\n } else {\n const wellKnownName: string | undefined = TypeScriptHelpers.tryDecodeWellKnownSymbolName(\n followedSymbol.escapedName\n );\n if (wellKnownName) {\n // TypeScript binds well-known ECMAScript symbols like 'Symbol.iterator' as '__@iterator'.\n // This converts a string like '__@iterator' into the property name '[Symbol.iterator]'.\n localName = wellKnownName;\n } else if (TypeScriptHelpers.isUniqueSymbolName(followedSymbol.escapedName)) {\n for (const decl of followedSymbol.declarations || []) {\n const declName: ts.DeclarationName | undefined = ts.getNameOfDeclaration(decl);\n if (declName && ts.isComputedPropertyName(declName)) {\n const lateName: string | undefined = TypeScriptHelpers.tryGetLateBoundName(declName);\n if (lateName !== undefined) {\n localName = lateName;\n break;\n }\n }\n }\n }\n }\n\n const navigation: Navigation = this._getNavigationToSymbol(followedSymbol);\n\n // If the symbol is a global, ensure the source is global.\n if (sourceFile && !ts.isExternalModule(sourceFile) && parentRef.source !== GlobalSource.instance) {\n parentRef = new DeclarationReference(GlobalSource.instance);\n }\n\n return parentRef\n .addNavigationStep(navigation, localName)\n .withMeaning(DeclarationReferenceGenerator._getMeaningOfSymbol(followedSymbol, meaning));\n }\n\n private _getParentReference(symbol: ts.Symbol): DeclarationReference | undefined {\n const declaration: ts.Node | undefined = TypeScriptHelpers.tryGetADeclaration(symbol);\n const sourceFile: ts.SourceFile | undefined = declaration?.getSourceFile();\n\n // Note that it's possible for a symbol to be exported from an entry point as well as one or more\n // namespaces. In that case, it's not clear what to choose as its parent. Today's logic is neither\n // perfect nor particularly stable to API items being renamed and shuffled around.\n const entity: CollectorEntity | undefined = this._collector.tryGetEntityForSymbol(symbol);\n if (entity) {\n if (entity.exportedFromEntryPoint) {\n return new DeclarationReference(this._sourceFileToModuleSource(sourceFile));\n }\n\n const firstExportingConsumableParent: CollectorEntity | undefined =\n entity.getFirstExportingConsumableParent();\n if (\n firstExportingConsumableParent &&\n firstExportingConsumableParent.astEntity instanceof AstNamespaceImport\n ) {\n const parentSymbol: ts.Symbol | undefined = TypeScriptInternals.tryGetSymbolForDeclaration(\n firstExportingConsumableParent.astEntity.declaration,\n this._collector.typeChecker\n );\n if (parentSymbol) {\n return this._symbolToDeclarationReference(\n parentSymbol,\n parentSymbol.flags,\n /*includeModuleSymbols*/ true\n );\n }\n }\n }\n\n // Next, try to find a parent symbol via the symbol tree.\n const parentSymbol: ts.Symbol | undefined = TypeScriptInternals.getSymbolParent(symbol);\n if (parentSymbol) {\n return this._symbolToDeclarationReference(\n parentSymbol,\n parentSymbol.flags,\n /*includeModuleSymbols*/ true\n );\n }\n\n // If that doesn't work, try to find a parent symbol via the node tree. As far as we can tell,\n // this logic is only needed for local symbols within namespaces. For example:\n //\n // ```\n // export namespace n {\n // type SomeType = number;\n // export function someFunction(): SomeType { return 5; }\n // }\n // ```\n //\n // In the example above, `SomeType` doesn't have a parent symbol per the TS internal API above,\n // but its reference still needs to be qualified with the parent reference for `n`.\n const grandParent: ts.Node | undefined = declaration?.parent?.parent;\n if (grandParent && ts.isModuleDeclaration(grandParent)) {\n const grandParentSymbol: ts.Symbol | undefined = TypeScriptInternals.tryGetSymbolForDeclaration(\n grandParent,\n this._collector.typeChecker\n );\n if (grandParentSymbol) {\n return this._symbolToDeclarationReference(\n grandParentSymbol,\n grandParentSymbol.flags,\n /*includeModuleSymbols*/ true\n );\n }\n }\n\n // At this point, we have a local symbol in a module.\n if (sourceFile && ts.isExternalModule(sourceFile)) {\n return new DeclarationReference(this._sourceFileToModuleSource(sourceFile));\n } else {\n return new DeclarationReference(GlobalSource.instance);\n }\n }\n\n private _getPackageName(sourceFile: ts.SourceFile): string {\n if (this._collector.program.isSourceFileFromExternalLibrary(sourceFile)) {\n const packageJson: INodePackageJson | undefined =\n this._collector.packageJsonLookup.tryLoadNodePackageJsonFor(sourceFile.fileName);\n\n if (packageJson && packageJson.name) {\n return packageJson.name;\n }\n return DeclarationReferenceGenerator.unknownReference;\n }\n return this._collector.workingPackage.name;\n }\n\n private _sourceFileToModuleSource(sourceFile: ts.SourceFile | undefined): GlobalSource | ModuleSource {\n if (sourceFile && ts.isExternalModule(sourceFile)) {\n const packageName: string = this._getPackageName(sourceFile);\n\n if (this._collector.bundledPackageNames.has(packageName)) {\n // The api-extractor.json config file has a \"bundledPackages\" setting, which causes imports from\n // certain NPM packages to be treated as part of the working project. In this case, we need to\n // substitute the working package name.\n return new ModuleSource(this._collector.workingPackage.name);\n } else {\n return new ModuleSource(packageName);\n }\n }\n return GlobalSource.instance;\n }\n}\n"]}
1
+ {"version":3,"file":"DeclarationReferenceGenerator.js","sourceRoot":"","sources":["../../src/generators/DeclarationReferenceGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\n/* eslint-disable no-bitwise */\nimport * as ts from 'typescript';\nimport {\n DeclarationReference,\n ModuleSource,\n GlobalSource,\n Navigation,\n Meaning\n} from '@microsoft/tsdoc/lib-commonjs/beta/DeclarationReference';\nimport { INodePackageJson, InternalError } from '@rushstack/node-core-library';\nimport { TypeScriptHelpers } from '../analyzer/TypeScriptHelpers';\nimport { TypeScriptInternals } from '../analyzer/TypeScriptInternals';\nimport { Collector } from '../collector/Collector';\nimport { CollectorEntity } from '../collector/CollectorEntity';\nimport { AstNamespaceImport } from '../analyzer/AstNamespaceImport';\n\nexport class DeclarationReferenceGenerator {\n public static readonly unknownReference: string = '?';\n\n private _collector: Collector;\n\n public constructor(collector: Collector) {\n this._collector = collector;\n }\n\n /**\n * Gets the UID for a TypeScript Identifier that references a type.\n */\n public getDeclarationReferenceForIdentifier(node: ts.Identifier): DeclarationReference | undefined {\n const symbol: ts.Symbol | undefined = this._collector.typeChecker.getSymbolAtLocation(node);\n if (symbol !== undefined) {\n const isExpression: boolean = DeclarationReferenceGenerator._isInExpressionContext(node);\n return (\n this.getDeclarationReferenceForSymbol(\n symbol,\n isExpression ? ts.SymbolFlags.Value : ts.SymbolFlags.Type\n ) ||\n this.getDeclarationReferenceForSymbol(\n symbol,\n isExpression ? ts.SymbolFlags.Type : ts.SymbolFlags.Value\n ) ||\n this.getDeclarationReferenceForSymbol(symbol, ts.SymbolFlags.Namespace)\n );\n }\n }\n\n /**\n * Gets the DeclarationReference for a TypeScript Symbol for a given meaning.\n */\n public getDeclarationReferenceForSymbol(\n symbol: ts.Symbol,\n meaning: ts.SymbolFlags\n ): DeclarationReference | undefined {\n return this._symbolToDeclarationReference(symbol, meaning, /*includeModuleSymbols*/ false);\n }\n\n private static _isInExpressionContext(node: ts.Node): boolean {\n switch (node.parent.kind) {\n case ts.SyntaxKind.TypeQuery:\n case ts.SyntaxKind.ComputedPropertyName:\n return true;\n case ts.SyntaxKind.QualifiedName:\n return DeclarationReferenceGenerator._isInExpressionContext(node.parent);\n default:\n return false;\n }\n }\n\n private static _isExternalModuleSymbol(symbol: ts.Symbol): boolean {\n return (\n !!(symbol.flags & ts.SymbolFlags.ValueModule) &&\n symbol.valueDeclaration !== undefined &&\n ts.isSourceFile(symbol.valueDeclaration)\n );\n }\n\n private static _isSameSymbol(left: ts.Symbol | undefined, right: ts.Symbol): boolean {\n return (\n left === right ||\n !!(\n left &&\n left.valueDeclaration &&\n right.valueDeclaration &&\n left.valueDeclaration === right.valueDeclaration\n )\n );\n }\n\n private _getNavigationToSymbol(symbol: ts.Symbol): Navigation {\n const declaration: ts.Declaration | undefined = TypeScriptHelpers.tryGetADeclaration(symbol);\n const sourceFile: ts.SourceFile | undefined = declaration?.getSourceFile();\n const parent: ts.Symbol | undefined = TypeScriptInternals.getSymbolParent(symbol);\n\n // If it's global or from an external library, then use either Members or Exports. It's not possible for\n // global symbols or external library symbols to be Locals.\n const isGlobal: boolean = !!sourceFile && !ts.isExternalModule(sourceFile);\n const isFromExternalLibrary: boolean =\n !!sourceFile && this._collector.program.isSourceFileFromExternalLibrary(sourceFile);\n if (isGlobal || isFromExternalLibrary) {\n if (\n parent &&\n parent.members &&\n DeclarationReferenceGenerator._isSameSymbol(parent.members.get(symbol.escapedName), symbol)\n ) {\n return Navigation.Members;\n }\n\n return Navigation.Exports;\n }\n\n // Otherwise, this symbol is from the current package. If we've found an associated consumable\n // `CollectorEntity`, then use Exports. We use `consumable` here instead of `exported` because\n // if the symbol is exported from a non-consumable `AstNamespaceImport`, we don't want to use\n // Exports. We should use Locals instead.\n const entity: CollectorEntity | undefined = this._collector.tryGetEntityForSymbol(symbol);\n if (entity?.consumable) {\n return Navigation.Exports;\n }\n\n // If its parent symbol is not a source file, then use either Exports or Members. If the parent symbol\n // is a source file, but it wasn't exported from the package entry point (in the check above), then the\n // symbol is a local, so fall through below.\n if (parent && !DeclarationReferenceGenerator._isExternalModuleSymbol(parent)) {\n if (\n parent.members &&\n DeclarationReferenceGenerator._isSameSymbol(parent.members.get(symbol.escapedName), symbol)\n ) {\n return Navigation.Members;\n }\n\n return Navigation.Exports;\n }\n\n // Otherwise, we have a local symbol, so use a Locals navigation. These are either:\n //\n // 1. Symbols that are exported from a file module but not the package entry point.\n // 2. Symbols that are not exported from their parent module.\n return Navigation.Locals;\n }\n\n private static _getMeaningOfSymbol(symbol: ts.Symbol, meaning: ts.SymbolFlags): Meaning | undefined {\n if (symbol.flags & meaning & ts.SymbolFlags.Class) {\n return Meaning.Class;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Enum) {\n return Meaning.Enum;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Interface) {\n return Meaning.Interface;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.TypeAlias) {\n return Meaning.TypeAlias;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Function) {\n return Meaning.Function;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Variable) {\n return Meaning.Variable;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Module) {\n return Meaning.Namespace;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.ClassMember) {\n return Meaning.Member;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Constructor) {\n return Meaning.Constructor;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.EnumMember) {\n return Meaning.Member;\n }\n if (symbol.flags & meaning & ts.SymbolFlags.Signature) {\n if (symbol.escapedName === ts.InternalSymbolName.Call) {\n return Meaning.CallSignature;\n }\n if (symbol.escapedName === ts.InternalSymbolName.New) {\n return Meaning.ConstructSignature;\n }\n if (symbol.escapedName === ts.InternalSymbolName.Index) {\n return Meaning.IndexSignature;\n }\n }\n if (symbol.flags & meaning & ts.SymbolFlags.TypeParameter) {\n // This should have already been handled in `getDeclarationReferenceOfSymbol`.\n throw new InternalError('Not supported.');\n }\n return undefined;\n }\n\n private _symbolToDeclarationReference(\n symbol: ts.Symbol,\n meaning: ts.SymbolFlags,\n includeModuleSymbols: boolean\n ): DeclarationReference | undefined {\n const declaration: ts.Node | undefined = TypeScriptHelpers.tryGetADeclaration(symbol);\n const sourceFile: ts.SourceFile | undefined = declaration?.getSourceFile();\n\n let followedSymbol: ts.Symbol = symbol;\n if (followedSymbol.flags & ts.SymbolFlags.ExportValue) {\n followedSymbol = this._collector.typeChecker.getExportSymbolOfSymbol(followedSymbol);\n }\n if (followedSymbol.flags & ts.SymbolFlags.Alias) {\n followedSymbol = this._collector.typeChecker.getAliasedSymbol(followedSymbol);\n\n // Without this logic, we end up following the symbol `ns` in `import * as ns from './file'` to\n // the actual file `file.ts`. We don't want to do this, so revert to the original symbol.\n if (followedSymbol.flags & ts.SymbolFlags.ValueModule) {\n followedSymbol = symbol;\n }\n }\n\n if (DeclarationReferenceGenerator._isExternalModuleSymbol(followedSymbol)) {\n if (!includeModuleSymbols) {\n return undefined;\n }\n return new DeclarationReference(this._sourceFileToModuleSource(sourceFile));\n }\n\n // Do not generate a declaration reference for a type parameter.\n if (followedSymbol.flags & ts.SymbolFlags.TypeParameter) {\n return undefined;\n }\n\n let parentRef: DeclarationReference | undefined = this._getParentReference(followedSymbol);\n if (!parentRef) {\n return undefined;\n }\n\n let localName: string = followedSymbol.name;\n const entity: CollectorEntity | undefined = this._collector.tryGetEntityForSymbol(followedSymbol);\n if (entity?.nameForEmit) {\n localName = entity.nameForEmit;\n }\n\n if (followedSymbol.escapedName === ts.InternalSymbolName.Constructor) {\n localName = 'constructor';\n } else {\n const wellKnownName: string | undefined = TypeScriptHelpers.tryDecodeWellKnownSymbolName(\n followedSymbol.escapedName\n );\n if (wellKnownName) {\n // TypeScript binds well-known ECMAScript symbols like 'Symbol.iterator' as '__@iterator'.\n // This converts a string like '__@iterator' into the property name '[Symbol.iterator]'.\n localName = wellKnownName;\n } else if (TypeScriptHelpers.isUniqueSymbolName(followedSymbol.escapedName)) {\n for (const decl of followedSymbol.declarations || []) {\n const declName: ts.DeclarationName | undefined = ts.getNameOfDeclaration(decl);\n if (declName && ts.isComputedPropertyName(declName)) {\n const lateName: string | undefined = TypeScriptHelpers.tryGetLateBoundName(declName);\n if (lateName !== undefined) {\n localName = lateName;\n break;\n }\n }\n }\n }\n }\n\n const navigation: Navigation = this._getNavigationToSymbol(followedSymbol);\n\n // If the symbol is a global, ensure the source is global.\n if (sourceFile && !ts.isExternalModule(sourceFile) && parentRef.source !== GlobalSource.instance) {\n parentRef = new DeclarationReference(GlobalSource.instance);\n }\n\n return parentRef\n .addNavigationStep(navigation, localName)\n .withMeaning(DeclarationReferenceGenerator._getMeaningOfSymbol(followedSymbol, meaning));\n }\n\n private _getParentReference(symbol: ts.Symbol): DeclarationReference | undefined {\n const declaration: ts.Node | undefined = TypeScriptHelpers.tryGetADeclaration(symbol);\n const sourceFile: ts.SourceFile | undefined = declaration?.getSourceFile();\n\n // Note that it's possible for a symbol to be exported from an entry point as well as one or more\n // namespaces. In that case, it's not clear what to choose as its parent. Today's logic is neither\n // perfect nor particularly stable to API items being renamed and shuffled around.\n const entity: CollectorEntity | undefined = this._collector.tryGetEntityForSymbol(symbol);\n if (entity) {\n if (entity.exportedFromEntryPoint) {\n return new DeclarationReference(this._sourceFileToModuleSource(sourceFile));\n }\n\n const firstExportingConsumableParent: CollectorEntity | undefined =\n entity.getFirstExportingConsumableParent();\n if (\n firstExportingConsumableParent &&\n firstExportingConsumableParent.astEntity instanceof AstNamespaceImport\n ) {\n const parentSymbol: ts.Symbol | undefined = TypeScriptInternals.tryGetSymbolForDeclaration(\n firstExportingConsumableParent.astEntity.declaration,\n this._collector.typeChecker\n );\n if (parentSymbol) {\n return this._symbolToDeclarationReference(\n parentSymbol,\n parentSymbol.flags,\n /*includeModuleSymbols*/ true\n );\n }\n }\n }\n\n // Next, try to find a parent symbol via the symbol tree.\n const parentSymbol: ts.Symbol | undefined = TypeScriptInternals.getSymbolParent(symbol);\n if (parentSymbol) {\n return this._symbolToDeclarationReference(\n parentSymbol,\n parentSymbol.flags,\n /*includeModuleSymbols*/ true\n );\n }\n\n // If that doesn't work, try to find a parent symbol via the node tree. As far as we can tell,\n // this logic is only needed for local symbols within namespaces. For example:\n //\n // ```\n // export namespace n {\n // type SomeType = number;\n // export function someFunction(): SomeType { return 5; }\n // }\n // ```\n //\n // In the example above, `SomeType` doesn't have a parent symbol per the TS internal API above,\n // but its reference still needs to be qualified with the parent reference for `n`.\n const grandParent: ts.Node | undefined = declaration?.parent?.parent;\n if (grandParent && ts.isModuleDeclaration(grandParent)) {\n const grandParentSymbol: ts.Symbol | undefined = TypeScriptInternals.tryGetSymbolForDeclaration(\n grandParent,\n this._collector.typeChecker\n );\n if (grandParentSymbol) {\n return this._symbolToDeclarationReference(\n grandParentSymbol,\n grandParentSymbol.flags,\n /*includeModuleSymbols*/ true\n );\n }\n }\n\n // At this point, we have a local symbol in a module.\n if (sourceFile && ts.isExternalModule(sourceFile)) {\n return new DeclarationReference(this._sourceFileToModuleSource(sourceFile));\n } else {\n return new DeclarationReference(GlobalSource.instance);\n }\n }\n\n private _getPackageName(sourceFile: ts.SourceFile): string {\n if (this._collector.program.isSourceFileFromExternalLibrary(sourceFile)) {\n const packageJson: INodePackageJson | undefined =\n this._collector.packageJsonLookup.tryLoadNodePackageJsonFor(sourceFile.fileName);\n\n if (packageJson && packageJson.name) {\n return packageJson.name;\n }\n return DeclarationReferenceGenerator.unknownReference;\n }\n return this._collector.workingPackage.name;\n }\n\n private _sourceFileToModuleSource(sourceFile: ts.SourceFile | undefined): GlobalSource | ModuleSource {\n if (sourceFile && ts.isExternalModule(sourceFile)) {\n const packageName: string = this._getPackageName(sourceFile);\n\n if (this._collector.bundledPackageNames.has(packageName)) {\n // The api-extractor.json config file has a \"bundledPackages\" setting, which causes imports from\n // certain NPM packages to be treated as part of the working project. In this case, we need to\n // substitute the working package name.\n return new ModuleSource(this._collector.workingPackage.name);\n } else {\n return new ModuleSource(packageName);\n }\n }\n return GlobalSource.instance;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/api-extractor",
3
- "version": "7.34.8",
3
+ "version": "7.35.0",
4
4
  "description": "Analyze the exported API for a TypeScript library and generate reviews, documentation, and .d.ts rollups",
5
5
  "keywords": [
6
6
  "typescript",
@@ -39,21 +39,21 @@
39
39
  "resolve": "~1.22.1",
40
40
  "semver": "~7.3.0",
41
41
  "source-map": "~0.6.1",
42
- "typescript": "~4.8.4",
43
- "@microsoft/api-extractor-model": "7.26.8",
44
- "@rushstack/node-core-library": "3.58.0",
45
- "@rushstack/rig-package": "0.3.18",
46
- "@rushstack/ts-command-line": "4.13.2"
42
+ "typescript": "~5.0.4",
43
+ "@microsoft/api-extractor-model": "7.27.0",
44
+ "@rushstack/node-core-library": "3.59.1",
45
+ "@rushstack/rig-package": "0.3.19",
46
+ "@rushstack/ts-command-line": "4.13.3"
47
47
  },
48
48
  "devDependencies": {
49
- "@rushstack/heft": "0.49.3",
50
- "@rushstack/heft-node-rig": "1.11.14",
49
+ "@rushstack/heft": "0.50.4",
50
+ "@rushstack/heft-node-rig": "1.12.10",
51
51
  "@types/heft-jest": "1.0.1",
52
52
  "@types/lodash": "4.14.116",
53
53
  "@types/node": "14.18.36",
54
54
  "@types/resolve": "1.20.2",
55
55
  "@types/semver": "7.3.5",
56
- "@rushstack/eslint-config": "3.2.0"
56
+ "@rushstack/eslint-config": "3.3.0"
57
57
  },
58
58
  "scripts": {
59
59
  "build": "heft build --clean",