diff --git a/apps/api-extractor/src/analyzer/ExportAnalyzer.ts b/apps/api-extractor/src/analyzer/ExportAnalyzer.ts index b7c9ad7ab97..33867923bb5 100644 --- a/apps/api-extractor/src/analyzer/ExportAnalyzer.ts +++ b/apps/api-extractor/src/analyzer/ExportAnalyzer.ts @@ -259,9 +259,18 @@ export class ExportAnalyzer { importOrExportDeclaration: ts.ImportDeclaration | ts.ExportDeclaration | ts.ImportTypeNode, moduleSpecifier: string ): boolean { + const specifier: ts.TypeNode | ts.Expression | undefined = ts.isImportTypeNode(importOrExportDeclaration) + ? importOrExportDeclaration.argument + : importOrExportDeclaration.moduleSpecifier; + const mode: ts.ModuleKind.CommonJS | ts.ModuleKind.ESNext | undefined = + specifier && ts.isStringLiteralLike(specifier) + ? TypeScriptInternals.getModeForUsageLocation(importOrExportDeclaration.getSourceFile(), specifier) + : undefined; + const resolvedModule: ts.ResolvedModuleFull | undefined = TypeScriptInternals.getResolvedModule( importOrExportDeclaration.getSourceFile(), - moduleSpecifier + moduleSpecifier, + mode ); if (resolvedModule === undefined) { @@ -863,9 +872,18 @@ export class ExportAnalyzer { exportSymbol: ts.Symbol ): AstModule { const moduleSpecifier: string = this._getModuleSpecifier(importOrExportDeclaration); + const mode: ts.ModuleKind.CommonJS | ts.ModuleKind.ESNext | undefined = + importOrExportDeclaration.moduleSpecifier && + ts.isStringLiteralLike(importOrExportDeclaration.moduleSpecifier) + ? TypeScriptInternals.getModeForUsageLocation( + importOrExportDeclaration.getSourceFile(), + importOrExportDeclaration.moduleSpecifier + ) + : undefined; const resolvedModule: ts.ResolvedModuleFull | undefined = TypeScriptInternals.getResolvedModule( importOrExportDeclaration.getSourceFile(), - moduleSpecifier + moduleSpecifier, + mode ); if (resolvedModule === undefined) { diff --git a/apps/api-extractor/src/analyzer/TypeScriptInternals.ts b/apps/api-extractor/src/analyzer/TypeScriptInternals.ts index 4c35cc1ded9..ae3c0e04316 100644 --- a/apps/api-extractor/src/analyzer/TypeScriptInternals.ts +++ b/apps/api-extractor/src/analyzer/TypeScriptInternals.ts @@ -83,12 +83,26 @@ export class TypeScriptInternals { */ public static getResolvedModule( sourceFile: ts.SourceFile, - moduleNameText: string + moduleNameText: string, + mode: ts.ModuleKind.CommonJS | ts.ModuleKind.ESNext | undefined ): ts.ResolvedModuleFull | undefined { // Compiler internal: - // https://github.com/microsoft/TypeScript/blob/v3.2.2/src/compiler/utilities.ts#L218 + // https://github.com/microsoft/TypeScript/blob/v4.7.2/src/compiler/utilities.ts#L161 - return (ts as any).getResolvedModule(sourceFile, moduleNameText); + return (ts as any).getResolvedModule(sourceFile, moduleNameText, mode); + } + + /** + * Gets the mode required for module resolution required with the addition of Node16/nodenext + */ + public static getModeForUsageLocation( + file: { impliedNodeFormat?: ts.SourceFile['impliedNodeFormat'] }, + usage: ts.StringLiteralLike | undefined + ): ts.ModuleKind.CommonJS | ts.ModuleKind.ESNext | undefined { + // Compiler internal: + // https://github.com/microsoft/TypeScript/blob/v4.7.2/src/compiler/program.ts#L568 + + return (ts as any).getModeForUsageLocation?.(file, usage); } /** diff --git a/common/changes/@microsoft/api-extractor/users-chhol-fix-getResolvedModule-params_2022-05-25-17-20.json b/common/changes/@microsoft/api-extractor/users-chhol-fix-getResolvedModule-params_2022-05-25-17-20.json new file mode 100644 index 00000000000..354890a1249 --- /dev/null +++ b/common/changes/@microsoft/api-extractor/users-chhol-fix-getResolvedModule-params_2022-05-25-17-20.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@microsoft/api-extractor", + "comment": "Fix an issue where API Extractor would fail to run on a project where `\"moduleResolution\"` is set to `\"Node16\"` in `tsconfig.json`", + "type": "patch" + } + ], + "packageName": "@microsoft/api-extractor" +} \ No newline at end of file