UNPKG

@jqassistant/ts-lce

Version:

Tool to extract language concepts from a TypeScript codebase and export them to a JSON file.

89 lines (88 loc) 7.62 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ExportDeclarationProcessor = void 0; const utils_1 = require("@typescript-eslint/utils"); const concept_1 = require("../concept"); const class_declaration_concept_1 = require("../concepts/class-declaration.concept"); const enum_declaration_concept_1 = require("../concepts/enum-declaration.concept"); const export_declaration_concept_1 = require("../concepts/export-declaration.concept"); const function_declaration_concept_1 = require("../concepts/function-declaration.concept"); const interface_declaration_concept_1 = require("../concepts/interface-declaration.concept"); const type_alias_declaration_concept_1 = require("../concepts/type-alias-declaration.concept"); const variable_declaration_concept_1 = require("../concepts/variable-declaration.concept"); const execution_condition_1 = require("../execution-condition"); const modulepath_utils_1 = require("../utils/modulepath.utils"); const processor_1 = require("../processor"); const export_declaration_traverser_1 = require("../traversers/export-declaration.traverser"); const dependency_resolution_processor_1 = require("./dependency-resolution.processor"); class ExportDeclarationProcessor extends processor_1.Processor { executionCondition = new execution_condition_1.ExecutionCondition([utils_1.AST_NODE_TYPES.ExportAllDeclaration, utils_1.AST_NODE_TYPES.ExportDefaultDeclaration, utils_1.AST_NODE_TYPES.ExportNamedDeclaration], () => true); postChildrenProcessing({ node, localContexts, globalContext }, childConcepts) { const concepts = []; if (node.type === utils_1.AST_NODE_TYPES.ExportNamedDeclaration) { let source; if (node.source) { source = modulepath_utils_1.ModulePathUtils.normalizeImportPath(globalContext.projectInfo.rootPath, node.source.value, globalContext.sourceFilePathAbsolute); } if (node.declaration) { // direct export of a declaration definition (e.g. "export class MyClass { ... }") const identifier = this.extractExportedIdentifier(childConcepts.get(export_declaration_traverser_1.ExportNamedDeclarationTraverser.DECLARATION_PROP)); if (identifier) { const globalDeclFqn = dependency_resolution_processor_1.DependencyResolutionProcessor.constructFQNPrefix(localContexts).globalFqn + identifier; concepts.push((0, concept_1.singleEntryConceptMap)(export_declaration_concept_1.LCEExportDeclaration.conceptId, new export_declaration_concept_1.LCEExportDeclaration(identifier, undefined, globalDeclFqn, undefined, false, node.exportKind, globalContext.sourceFilePathAbsolute))); } } else { // export of declaration list (e.g. "export {MyClass, MyFunc}") // may also contain a default export using the "default" specifier // may also be a re-export for (const specifier of node.specifiers) { const localName = specifier.local.type === utils_1.AST_NODE_TYPES.Identifier ? specifier.local.name : specifier.local.raw; const exportedName = specifier.exported.type === utils_1.AST_NODE_TYPES.Identifier ? specifier.exported.name : specifier.exported.raw; const globalDeclFqn = dependency_resolution_processor_1.DependencyResolutionProcessor.constructFQNPrefix(localContexts).globalFqn + localName; concepts.push((0, concept_1.singleEntryConceptMap)(export_declaration_concept_1.LCEExportDeclaration.conceptId, new export_declaration_concept_1.LCEExportDeclaration(localName, exportedName === "default" || exportedName === localName ? undefined : exportedName, globalDeclFqn, source, exportedName === "default", node.exportKind, globalContext.sourceFilePathAbsolute))); } } } else if (node.type === utils_1.AST_NODE_TYPES.ExportDefaultDeclaration) { // default export (e.g. "export default myFunc") // NOTE: anonymous declaration may also be directly exported as default (in that case "default" is used as identifier name) const identifier = this.extractExportedIdentifier(childConcepts.get(export_declaration_traverser_1.ExportDefaultDeclarationTraverser.DECLARATION_PROP)) ?? "default"; if (identifier) { const globalDeclFqn = dependency_resolution_processor_1.DependencyResolutionProcessor.constructFQNPrefix(localContexts).globalFqn + identifier; concepts.push((0, concept_1.singleEntryConceptMap)(export_declaration_concept_1.LCEExportDeclaration.conceptId, new export_declaration_concept_1.LCEExportDeclaration(identifier, undefined, globalDeclFqn, undefined, true, node.exportKind, globalContext.sourceFilePathAbsolute))); } } else if (node.type === utils_1.AST_NODE_TYPES.ExportAllDeclaration && node.source) { // re-export of all declarations of a module (e.g. "export * from "./myModule") const source = modulepath_utils_1.ModulePathUtils.normalizeImportPath(globalContext.projectInfo.rootPath, node.source.value, globalContext.sourceFilePathAbsolute); concepts.push((0, concept_1.singleEntryConceptMap)(export_declaration_concept_1.LCEExportDeclaration.conceptId, new export_declaration_concept_1.LCEExportDeclaration("*", node.exported?.name, dependency_resolution_processor_1.DependencyResolutionProcessor.constructScopeFQN(localContexts).globalFqn, source, false, "namespace", globalContext.sourceFilePathAbsolute))); } return (0, concept_1.mergeConceptMaps)(...concepts); } extractExportedIdentifier(exportedConcept) { let identifier; if (exportedConcept) { if (exportedConcept.has(class_declaration_concept_1.LCEClassDeclaration.conceptId)) { identifier = (0, concept_1.getAndCastConcepts)(class_declaration_concept_1.LCEClassDeclaration.conceptId, exportedConcept)[0].className; } else if (exportedConcept.has(interface_declaration_concept_1.LCEInterfaceDeclaration.conceptId)) { identifier = (0, concept_1.getAndCastConcepts)(interface_declaration_concept_1.LCEInterfaceDeclaration.conceptId, exportedConcept)[0].interfaceName; } else if (exportedConcept.has(function_declaration_concept_1.LCEFunctionDeclaration.conceptId)) { identifier = (0, concept_1.getAndCastConcepts)(function_declaration_concept_1.LCEFunctionDeclaration.conceptId, exportedConcept)[0].functionName; } else if (exportedConcept.has(type_alias_declaration_concept_1.LCETypeAliasDeclaration.conceptId)) { identifier = (0, concept_1.getAndCastConcepts)(type_alias_declaration_concept_1.LCETypeAliasDeclaration.conceptId, exportedConcept)[0].typeAliasName; } else if (exportedConcept.has(enum_declaration_concept_1.LCEEnumDeclaration.conceptId)) { identifier = (0, concept_1.getAndCastConcepts)(enum_declaration_concept_1.LCEEnumDeclaration.conceptId, exportedConcept)[0].enumName; } else if (exportedConcept.has(variable_declaration_concept_1.LCEVariableDeclaration.conceptId)) { identifier = (0, concept_1.getAndCastConcepts)(variable_declaration_concept_1.LCEVariableDeclaration.conceptId, exportedConcept)[0].variableName; } } return identifier; } } exports.ExportDeclarationProcessor = ExportDeclarationProcessor;