@addon24/eslint-config
Version:
ESLint configuration rules for WorldOfTextcraft projects - Centralized configuration for all project types
238 lines (214 loc) • 8.09 kB
JavaScript
/**
* 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,
},
};