UNPKG

@addon24/eslint-config

Version:

ESLint configuration rules for WorldOfTextcraft projects - Centralized configuration for all project types

238 lines (214 loc) 8.09 kB
/** * ESLint-Regel: Verbotet fromEntity-Methoden außerhalb des /dto/Entity/ Ordners * * Diese Regel stellt sicher, dass: * - DTOs im /dto/Entity/ Ordner fromEntity-Methoden haben DÜRFEN * - DTOs außerhalb des /dto/Entity/ Ordners KEINE fromEntity-Methoden haben DÜRFEN * - Request-, Response- und andere DTOs sind reine Datenstrukturen ohne Entity-Konvertierung */ /** @type {import('eslint').Rule.RuleModule} */ const forbidFromEntityOutsideEntityFolderRule = { meta: { type: "problem", docs: { description: "fromEntity-Methoden sind nur in DTOs im /dto/Entity/ Ordner erlaubt", category: "Architecture", recommended: true, }, hasSuggestions: true, schema: [], messages: { forbiddenFromEntityOutsideEntityFolder: "fromEntity-Methode ist in DTO '{{dtoName}}' nicht erlaubt. Diese Datei liegt außerhalb des /dto/Entity/ Ordners. fromEntity-Methoden sind nur für Entity-DTOs erlaubt.", forbiddenFromEntityArrayOutsideEntityFolder: "fromEntityArray-Methode ist in DTO '{{dtoName}}' nicht erlaubt. Diese Datei liegt außerhalb des /dto/Entity/ Ordners. fromEntityArray-Methoden sind nur für Entity-DTOs erlaubt.", suggestMoveToEntityFolder: "DTO '{{dtoName}}' sollte in den /dto/Entity/ Ordner verschoben werden, wenn es Entity-Konvertierung benötigt.", suggestRemoveFromEntityMethod: "fromEntity-Methode entfernen, da dieser DTO keine Entity-Konvertierung benötigt.", }, }, create(context) { return { ClassDeclaration(node) { const filename = context.getFilename(); const dtoName = node.id?.name; if (!dtoName || !dtoName.endsWith("Dto")) { return; // Kein DTO } // Prüfe, ob die Datei im /dto/Entity/ Ordner liegt const isInEntityFolder = filename.includes("/dto/Entity/"); if (isInEntityFolder) { return; // Entity-DTOs dürfen fromEntity-Methoden haben } // Prüfe auf fromEntity und fromEntityArray Methoden const hasFromEntity = node.body.body.some(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntity" ); const hasFromEntityArray = node.body.body.some(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntityArray" ); if (hasFromEntity) { context.report({ node, messageId: "forbiddenFromEntityOutsideEntityFolder", data: { dtoName, }, suggest: [ { messageId: "suggestMoveToEntityFolder", data: { dtoName }, fix: () => null, // Keine automatische Korrektur }, { messageId: "suggestRemoveFromEntityMethod", data: { dtoName }, fix: (fixer) => { // Finde und entferne die fromEntity-Methode const fromEntityMethod = node.body.body.find(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntity" ); if (fromEntityMethod) { return fixer.remove(fromEntityMethod); } return null; }, }, ], }); } if (hasFromEntityArray) { context.report({ node, messageId: "forbiddenFromEntityArrayOutsideEntityFolder", data: { dtoName, }, suggest: [ { messageId: "suggestMoveToEntityFolder", data: { dtoName }, fix: () => null, // Keine automatische Korrektur }, { messageId: "suggestRemoveFromEntityMethod", data: { dtoName }, fix: (fixer) => { // Finde und entferne die fromEntityArray-Methode const fromEntityArrayMethod = node.body.body.find(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntityArray" ); if (fromEntityArrayMethod) { return fixer.remove(fromEntityArrayMethod); } return null; }, }, ], }); } }, // Auch für export default class ExportDefaultDeclaration(node) { if (node.declaration.type !== "ClassDeclaration") { return; } const filename = context.getFilename(); const dtoName = node.declaration.id?.name; if (!dtoName || !dtoName.endsWith("Dto")) { return; // Kein DTO } // Prüfe, ob die Datei im /dto/Entity/ Ordner liegt const isInEntityFolder = filename.includes("/dto/Entity/"); if (isInEntityFolder) { return; // Entity-DTOs dürfen fromEntity-Methoden haben } // Prüfe auf fromEntity und fromEntityArray Methoden const hasFromEntity = node.declaration.body.body.some(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntity" ); const hasFromEntityArray = node.declaration.body.body.some(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntityArray" ); if (hasFromEntity) { context.report({ node, messageId: "forbiddenFromEntityOutsideEntityFolder", data: { dtoName, }, suggest: [ { messageId: "suggestMoveToEntityFolder", data: { dtoName }, fix: () => null, // Keine automatische Korrektur }, { messageId: "suggestRemoveFromEntityMethod", data: { dtoName }, fix: (fixer) => { // Finde und entferne die fromEntity-Methode const fromEntityMethod = node.declaration.body.body.find(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntity" ); if (fromEntityMethod) { return fixer.remove(fromEntityMethod); } return null; }, }, ], }); } if (hasFromEntityArray) { context.report({ node, messageId: "forbiddenFromEntityArrayOutsideEntityFolder", data: { dtoName, }, suggest: [ { messageId: "suggestMoveToEntityFolder", data: { dtoName }, fix: () => null, // Keine automatische Korrektur }, { messageId: "suggestRemoveFromEntityMethod", data: { dtoName }, fix: (fixer) => { // Finde und entferne die fromEntityArray-Methode const fromEntityArrayMethod = node.declaration.body.body.find(member => member.type === "MethodDefinition" && member.static && member.key?.name === "fromEntityArray" ); if (fromEntityArrayMethod) { return fixer.remove(fromEntityArrayMethod); } return null; }, }, ], }); } }, }; }, }; export default { rules: { "forbid-fromentity-outside-entity-folder": forbidFromEntityOutsideEntityFolderRule, }, };