@wroud/di-tools-codemod
Version:
@wroud/di-tools-codemod is a codemod utility that automates the migration of your codebase from Inversify to @wroud/di. It streamlines the transformation process, allowing for effortless and customizable transitions through configuration support.
57 lines (56 loc) • 2.8 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.transformDecorators = transformDecorators;
const isMultipleInjectDecorator_js_1 = require("./isMultipleInjectDecorator.js");
const isConstructorInjectDecorator_js_1 = require("./isConstructorInjectDecorator.js");
const isInjectableDecorator_js_1 = require("./isInjectableDecorator.js");
const createInjectableDecorator_js_1 = require("./createInjectableDecorator.js");
function transformDecorators(j, root, replacingPackage) {
const decoratedClasses = [];
root.find(j.ClassDeclaration).forEach((path) => {
const decorators = path.node.decorators || [];
const newDecorators = [
...decorators.filter((decorator) => !(0, isInjectableDecorator_js_1.isInjectableDecorator)([replacingPackage], decorator)),
];
if (newDecorators.length === decorators.length) {
return;
}
const constructors = j(path)
.find(j.ClassBody)
.filter((p) => p.parentPath.node === path.node)
.map((path) => j(path)
.find(j.ClassMethod, { kind: "constructor" })
.filter((p) => p.parentPath.node === path.node)
.paths());
const constructorParams = constructors.map((path) => j(path)
.find(j.Pattern, (node) => {
if (node.type === "TSParameterProperty") {
return true;
}
return node.type === "Identifier" && node.name !== "constructor";
})
.filter((p) => p.parentPath.node === path.node)
.paths());
const dependencies = [];
for (const param of constructorParams.nodes()) {
const decorators = param.decorators || [];
let type = j(param).find(j.TSTypeReference).nodes()[0]?.typeName;
if (!type && param.type === "Identifier") {
type = j(param).find(j.TSTypeAnnotation).nodes()[0]?.typeAnnotation;
}
if (!type) {
dependencies.push({ type: j.nullLiteral(), multiple: false });
continue;
}
const multiple = decorators.some((decorator) => (0, isMultipleInjectDecorator_js_1.isMultipleInjectDecorator)([replacingPackage], decorator));
dependencies.push({ type: type, multiple });
param.decorators = decorators.filter((decorator) => !(0, isConstructorInjectDecorator_js_1.isConstructorInjectDecorator)([replacingPackage], decorator));
}
newDecorators.push((0, createInjectableDecorator_js_1.createInjectableDecorator)(j, dependencies));
if (path.node.id) {
decoratedClasses.push(path.node.id.name);
}
path.node.decorators = newDecorators;
});
return decoratedClasses;
}
;