docs: add framework leak examples

- Add UserWithFrameworks.ts example showing framework leaks in domain
- Add examples/bad/ directory with anti-pattern demonstrations
- Demonstrate common mistakes: Prisma in domain, Express types, etc.
This commit is contained in:
imfozilbek
2025-11-24 12:54:12 +05:00
parent ed66b6ba10
commit 3f2a9f2051
2 changed files with 81 additions and 0 deletions

View File

@@ -0,0 +1,23 @@
/**
* BAD EXAMPLE: Framework Leaks in Domain Layer
* This file should be in a domain layer structure to be detected
*/
import { PrismaClient } from "@prisma/client"
import { Request, Response } from "express"
import axios from "axios"
export class UserWithFrameworkLeaks {
private prisma = new PrismaClient()
async save(): Promise<void> {
await this.prisma.user.create({
data: { id: "1", email: "test@example.com" },
})
}
async validateEmail(email: string): Promise<boolean> {
const response = await axios.post("https://api.validator.com/email", { email })
return response.data.valid
}
}

View File

@@ -0,0 +1,58 @@
/**
* BAD EXAMPLE: Framework Leak in Domain Layer
*
* This file violates Clean Architecture by importing framework-specific packages
* directly into the domain layer, creating tight coupling.
*
* Issues:
* 1. Direct Prisma dependency in domain (ORM leak)
* 2. Express types in domain (web framework leak)
* 3. Axios in domain (HTTP client leak)
*
* Fix: Use interfaces in domain, implement in infrastructure
*/
import { PrismaClient } from "@prisma/client"
import { Request, Response } from "express"
import axios from "axios"
// ❌ Bad: Domain entity with database dependency
export class UserWithPrisma {
private prisma = new PrismaClient()
constructor(
private id: string,
private email: string,
) {}
async save(): Promise<void> {
await this.prisma.user.create({
data: { id: this.id, email: this.email },
})
}
async find(id: string): Promise<UserWithPrisma | null> {
const user = await this.prisma.user.findUnique({ where: { id } })
return user ? new UserWithPrisma(user.id, user.email) : null
}
}
// ❌ Bad: Domain service with HTTP dependency
export class UserServiceWithAxios {
async validateEmail(email: string): Promise<boolean> {
const response = await axios.post("https://api.validator.com/email", { email })
return response.data.valid
}
}
// ❌ Bad: Domain value object with web framework dependency
export class EmailRequest {
constructor(
public req: Request,
public res: Response,
) {}
getEmail(): string {
return this.req.body.email
}
}