ntts
Version:
A CLI tool for refactoring an existing NodeJs application to a fully functional TypeScript application.
114 lines (113 loc) • 7.18 kB
JavaScript
;
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;