ntts
Version:
A CLI tool for refactoring an existing NodeJs application to a fully functional TypeScript application.
75 lines (74 loc) • 3.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var ts_morph_1 = require("ts-morph");
var combined_types_1 = require("../combined-types/combined-types");
var reference_finder_1 = require("../reference-finder/reference-finder");
var DeclarationFinder = /** @class */ (function () {
function DeclarationFinder() {
}
var _a;
_a = DeclarationFinder;
DeclarationFinder.getClassOrFunction = function (nameNode) {
var references = (0, reference_finder_1.findReferences)(nameNode).map(function (reference) { return reference.getDefinition().getDeclarationNode(); });
var result = references.reduce(function (acc, node) {
return _a.getClassOrFunctionDeclarationOrExpression(node) || acc;
}, undefined);
if (result) {
return result;
}
var last = references.length > 0 ? references[references.length - 1] : undefined;
if (ts_morph_1.Node.isExportAssignment(last)) {
return _a.getClassOrFunctionFromExportAssignment(last.getExpression());
}
if (ts_morph_1.Node.isExportSpecifier(last) || ts_morph_1.Node.isImportSpecifier(last)) {
return _a.getClassOrFunction(last.getNameNode());
}
var grandParent = last === null || last === void 0 ? void 0 : last.getParent();
if (ts_morph_1.Node.isImportClause(last) && ts_morph_1.Node.isImportDeclaration(grandParent) && last.getDefaultImport()) {
return _a.getClassOrFunctionFromDefaultExport(grandParent);
}
return undefined;
};
DeclarationFinder.getClassOrFunctionFromExportAssignment = function (expression) {
if (ts_morph_1.Node.isIdentifier(expression) || ts_morph_1.Node.isPropertyAccessExpression(expression)) {
return _a.getClassOrFunction(expression);
}
if (_a.isClassOrFunctionExpression(expression)) {
return expression;
}
return undefined;
};
DeclarationFinder.getClassOrFunctionFromDefaultExport = function (importDeclaration) {
var _b;
var sourceFile = importDeclaration.getModuleSpecifierSourceFile();
var declarations = (_b = sourceFile === null || sourceFile === void 0 ? void 0 : sourceFile.getDefaultExportSymbol()) === null || _b === void 0 ? void 0 : _b.getDeclarations();
if (!sourceFile || sourceFile.isInNodeModules() || sourceFile.isFromExternalLibrary()) {
return undefined;
}
if (!declarations || declarations.length <= 0) {
return undefined;
}
var first = declarations[0];
if (_a.isClassOrFunctionDeclaration(first)) {
return first;
}
if (ts_morph_1.Node.isExportAssignment(first)) {
return _a.getClassOrFunctionFromExportAssignment(first.getExpression());
}
return undefined;
};
DeclarationFinder.getClassOrFunctionDeclarationOrExpression = function (node) {
if (_a.isClassOrFunctionDeclaration(node)) {
return node;
}
if ((0, combined_types_1.isFieldDeclaration)(node)) {
var initializer = node.getInitializer();
return _a.isClassOrFunctionExpression(initializer) ? initializer : undefined;
}
return undefined;
};
DeclarationFinder.isClassOrFunctionExpression = function (node) { return ts_morph_1.Node.isFunctionExpression(node) || ts_morph_1.Node.isArrowFunction(node) || ts_morph_1.Node.isClassExpression(node); };
DeclarationFinder.isClassOrFunctionDeclaration = function (node) { return ts_morph_1.Node.isFunctionDeclaration(node) || ts_morph_1.Node.isMethodDeclaration(node) || ts_morph_1.Node.isClassDeclaration(node); };
return DeclarationFinder;
}());
exports.default = DeclarationFinder;