From 95978497be00adf1fb02b90cf944ce54a39d86e7 Mon Sep 17 00:00:00 2001 From: Jack Westbrook Date: Tue, 16 Jul 2024 13:12:35 +0200 Subject: [PATCH 1/2] feat(types-usage-evaluation): warn if exports don't have declarations --- src/types-usage-evaluator.ts | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/types-usage-evaluator.ts b/src/types-usage-evaluator.ts index bd18f6a..bcb4bfa 100644 --- a/src/types-usage-evaluator.ts +++ b/src/types-usage-evaluator.ts @@ -11,6 +11,7 @@ import { isNodeNamedDeclaration, splitTransientSymbol, } from './helpers/typescript'; +import { warnLog } from './logger'; export class TypesUsageEvaluator { private readonly typeChecker: ts.TypeChecker; @@ -141,20 +142,24 @@ export class TypesUsageEvaluator { // `export {}` or `export {} from 'mod'` if (ts.isExportDeclaration(node) && node.exportClause !== undefined && ts.isNamedExports(node.exportClause)) { for (const exportElement of node.exportClause.elements) { - const exportElementSymbol = getImportExportReferencedSymbol(exportElement, this.typeChecker); - - // i.e. `import * as NS from './local-module'` - const namespaceImportForElement = getDeclarationsForSymbol(exportElementSymbol).find(ts.isNamespaceImport); - if (namespaceImportForElement !== undefined) { - // the namespaced import itself doesn't add a "usage", but re-export of that imported namespace does - // so here we're handling the case where previously imported namespace import has been re-exported from a module - this.addUsagesForNamespacedModule(namespaceImportForElement, namespaceImportForElement.parent.parent.moduleSpecifier as ts.StringLiteral); - } + try { + const exportElementSymbol = getImportExportReferencedSymbol(exportElement, this.typeChecker); - // "link" referenced symbol with its import - const exportElementOwnSymbol = this.getNodeOwnSymbol(exportElement.name); - this.addUsages(exportElementSymbol, exportElementOwnSymbol); - this.addUsages(this.getActualSymbol(exportElementSymbol), exportElementOwnSymbol); + // i.e. `import * as NS from './local-module'` + const namespaceImportForElement = getDeclarationsForSymbol(exportElementSymbol).find(ts.isNamespaceImport); + if (namespaceImportForElement !== undefined) { + // the namespaced import itself doesn't add a "usage", but re-export of that imported namespace does + // so here we're handling the case where previously imported namespace import has been re-exported from a module + this.addUsagesForNamespacedModule(namespaceImportForElement, namespaceImportForElement.parent.parent.moduleSpecifier as ts.StringLiteral); + } + + // "link" referenced symbol with its import + const exportElementOwnSymbol = this.getNodeOwnSymbol(exportElement.name); + this.addUsages(exportElementSymbol, exportElementOwnSymbol); + this.addUsages(this.getActualSymbol(exportElementSymbol), exportElementOwnSymbol); + } catch (error) { + warnLog(`Unhandled declaration detected. Make sure types are installed for: ${node.moduleSpecifier?.getText()}!`); + } } } From fc77dad4900386d0f9a91fe3da44a1905c800537 Mon Sep 17 00:00:00 2001 From: Jack Westbrook Date: Thu, 5 Sep 2024 14:26:27 +0200 Subject: [PATCH 2/2] refactor(types-usage-evaluator): change warning message --- src/types-usage-evaluator.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/types-usage-evaluator.ts b/src/types-usage-evaluator.ts index bcb4bfa..bcb40fd 100644 --- a/src/types-usage-evaluator.ts +++ b/src/types-usage-evaluator.ts @@ -158,7 +158,7 @@ export class TypesUsageEvaluator { this.addUsages(exportElementSymbol, exportElementOwnSymbol); this.addUsages(this.getActualSymbol(exportElementSymbol), exportElementOwnSymbol); } catch (error) { - warnLog(`Unhandled declaration detected. Make sure types are installed for: ${node.moduleSpecifier?.getText()}!`); + warnLog(`Could not resolve declaration. Are types installed for module: ${node.moduleSpecifier?.getText()}?`); } } }