@addon24/eslint-config
Version:
ESLint configuration rules for WorldOfTextcraft projects - Centralized configuration for all project types
82 lines (70 loc) • 2.58 kB
JavaScript
const enforceNonEntityDtoCreateRule = {
meta: {
type: "problem",
docs: {
description: "Non-Entity-DTOs müssen create-Methoden bereitstellen und dürfen keine fromEntity-Methoden haben",
category: "Architecture",
recommended: true,
},
schema: [],
messages: {
missingCreateMethod: "Non-Entity-DTO-Klasse '{{dtoName}}' muss eine statische create-Methode bereitstellen",
forbiddenOtherMethods: "Non-Entity-DTO-Klasse '{{dtoName}}' darf nur create-Methoden haben. Andere statische Methoden sind verboten.",
},
},
create(context) {
const filename = context.getFilename();
// Prüfe, ob es sich um eine Non-Entity-DTO-Datei handelt
const isNonEntityDtoFile = filename.includes("/dto/") && !filename.includes("/dto/Entity/");
if (!isNonEntityDtoFile) {
return {};
}
let classNode = null;
let dtoClassName = "";
return {
ClassDeclaration(node) {
classNode = node;
dtoClassName = node.id?.name;
},
ExportDefaultDeclaration(node) {
if (node.declaration.type === "ClassDeclaration") {
classNode = node.declaration;
dtoClassName = node.declaration.id?.name;
}
},
"Program:exit"(node) {
if (!classNode || !dtoClassName) return;
// Ausnahme für BaseEntityDto (abstrakte Base-Klasse)
if (dtoClassName === "BaseEntityDto" && filename.endsWith("/dto/BaseEntityDto.ts")) {
return;
}
const methods = classNode.body.body.filter(member =>
member.type === "MethodDefinition" &&
member.static === true
);
const hasCreateMethod = methods.some(method =>
method.key?.name === "create"
);
// Request-DTOs sind von der create-Regel ausgenommen
const isRequestDto = filename.includes("/dto/Request/");
if (!isRequestDto) {
if (!hasCreateMethod) {
context.report({ node: classNode, messageId: "missingCreateMethod", data: { dtoName: dtoClassName } });
}
const allowedMethods = ["create"];
const forbiddenMethods = methods.filter(method =>
method.key?.name && !allowedMethods.includes(method.key.name)
);
forbiddenMethods.forEach(method => {
context.report({ node: method, messageId: "forbiddenOtherMethods", data: { dtoName: dtoClassName } });
});
}
}
};
},
};
export default {
rules: {
"enforce-nonentity-dto-create": enforceNonEntityDtoCreateRule,
},
};