@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
JavaScript
;
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;