UNPKG

ntts

Version:

A CLI tool for refactoring an existing NodeJs application to a fully functional TypeScript application.

114 lines (113 loc) 7.18 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var ts_morph_1 = require("ts-morph"); var export_validator_1 = __importDefault(require("./helpers/export-validator")); var export_parser_1 = __importDefault(require("./helpers/export-parser")); var used_names_1 = __importDefault(require("../helpers/used-names/used-names")); var top_level_refactor_1 = __importDefault(require("./top-level-refactor/top-level-refactor")); var nested_refactor_1 = __importDefault(require("./nested-refactor/nested-refactor")); var export_rename_1 = __importDefault(require("./export-rename/export-rename")); var variable_name_generator_1 = __importDefault(require("../helpers/variable-name-generator/variable-name-generator")); var variable_creator_1 = __importDefault(require("./helpers/variable-creator")); var ExportsRefactor = /** @class */ (function () { function ExportsRefactor() { } var _a; _a = ExportsRefactor; ExportsRefactor.moduleExportsToExport = function (sourceFile) { var usedNames = used_names_1.default.getDeclaredNames(sourceFile); var exportedVariables = sourceFile .getDescendantsOfKind(ts_morph_1.SyntaxKind.BinaryExpression) .reduce(function (variables, node) { if (!node.wasForgotten()) { return _a.refactorExport(node, variables, usedNames, sourceFile); } return variables; }, []); _a.insertExports(exportedVariables, sourceFile); export_rename_1.default.refactorExportReadAccess(exportedVariables, sourceFile); }; ExportsRefactor.insertExports = function (exportedVariables, sourceFile) { var exportConfig = exportedVariables.reduce(function (acc, exported) { return (exported.defaultExport ? __assign(__assign({}, acc), { _default: exported.name }) : __assign(__assign({}, acc), { named: acc.named.concat(exported.alias ? "".concat(exported.name, " as ").concat(exported.alias) : exported.name) })); }, { named: [] }); if (exportConfig._default) { sourceFile.addExportAssignment({ expression: exportConfig._default, isExportEquals: false }); } if (exportConfig.named.length > 0) { sourceFile.addExportDeclarations([{ namedExports: exportConfig.named }]); } }; ExportsRefactor.refactorExport = function (binary, exportedVariables, usedNames, sourceFile) { var identifiers = export_validator_1.default.isExportAssigment(binary); if (!identifiers) { return exportedVariables; } var filtered = export_parser_1.default.filterExportIdentifiers(identifiers); switch (filtered.length) { case 0: return _a.refactorElementAccessOrDefaultExport(binary, export_parser_1.default.getElementAccessOrDefaultBaseExport(identifiers), exportedVariables, usedNames, sourceFile); case 1: default: return _a.refactorPropertyAccessExport(filtered[0].getText(), binary, export_parser_1.default.getBaseExport(filtered), exportedVariables, usedNames, sourceFile); } }; ExportsRefactor.refactorPropertyAccessExport = function (exportName, binary, accessExpression, exportedVariables, usedNames, sourceFile) { var parent = binary.getParent(); var grandParent = parent === null || parent === void 0 ? void 0 : parent.getParent(); if (ts_morph_1.Node.isExpressionStatement(parent) && ts_morph_1.Node.isSourceFile(grandParent)) { return top_level_refactor_1.default.refactorTopLevelExport(exportName, binary, parent, accessExpression, exportedVariables, usedNames, false, sourceFile); } return nested_refactor_1.default.refactorNestedExport(exportName, binary, accessExpression, exportedVariables, usedNames, false, sourceFile); }; ExportsRefactor.refactorElementAccessOrDefaultExport = function (binary, accessExpression, exportedVariables, usedNames, sourceFile) { if (ts_morph_1.Node.isElementAccessExpression(accessExpression) && !export_parser_1.default.exportVariableExists('', exportedVariables, true)) { return _a.refactorNewElementAccessDefaultExport(binary, accessExpression, exportedVariables, usedNames, sourceFile); } return _a.refactorDefaultAssignmentExport(binary, accessExpression, exportedVariables, usedNames, sourceFile); }; ExportsRefactor.refactorDefaultAssignmentExport = function (binary, accessExpression, exportedVariables, usedNames, sourceFile) { var parent = binary.getParent(); var grandParent = parent === null || parent === void 0 ? void 0 : parent.getParent(); if (ts_morph_1.Node.isExpressionStatement(parent) && ts_morph_1.Node.isSourceFile(grandParent)) { return top_level_refactor_1.default.refactorTopLevelExport(_a.variableFromFileName(sourceFile), binary, parent, accessExpression, exportedVariables, usedNames, true, sourceFile); } return nested_refactor_1.default.refactorNestedExport(_a.variableFromFileName(sourceFile), binary, accessExpression, exportedVariables, usedNames, true, sourceFile); }; ExportsRefactor.variableFromFileName = function (sourceFile) { var parts = sourceFile.getFilePath().split('/'); if (parts.length > 0) { return variable_name_generator_1.default.variableNameFromImportId(parts[parts.length - 1]); } return '_default'; }; ExportsRefactor.refactorNewElementAccessDefaultExport = function (binary, elementAccess, exportedVariables, usedNames, sourceFile) { var exportedNames = exportedVariables.map(function (e) { return e.name; }); var exportName = _a.variableFromFileName(sourceFile); var usableName = variable_name_generator_1.default.getUsableVariableName(exportName, usedNames.concat(exportedNames)); var index = export_parser_1.default.getSourceFileIndex(binary); variable_creator_1.default.createVariable(usableName, index, '{}', ts_morph_1.VariableDeclarationKind.Const, sourceFile); var newDefaultExport = { name: usableName, defaultExport: true }; var expression = elementAccess.getExpression(); if (ts_morph_1.Node.isIdentifier(expression) || ts_morph_1.Node.isPropertyAccessExpression(expression) || ts_morph_1.Node.isElementAccessExpression(expression)) { return _a.refactorDefaultAssignmentExport(binary, expression, exportedVariables.concat(newDefaultExport), usedNames, sourceFile); } return exportedVariables; }; return ExportsRefactor; }()); exports.default = ExportsRefactor;