UNPKG

@samiyev/guardian

Version:

Research-backed code quality guardian for AI-assisted development. Detects hardcodes, secrets, circular deps, framework leaks, entity exposure, and 9 architecture violations. Enforces Clean Architecture/DDD principles. Works with GitHub Copilot, Cursor, W

82 lines 3.14 kB
import { IAggregateBoundaryDetector } from "../../domain/services/IAggregateBoundaryDetector"; import { AggregateBoundaryViolation } from "../../domain/value-objects/AggregateBoundaryViolation"; /** * Detects aggregate boundary violations in Domain-Driven Design * * This detector enforces DDD aggregate rules: * - Aggregates should reference each other only by ID or Value Objects * - Direct entity references across aggregates create tight coupling * - Each aggregate should be independently modifiable * * Folder structure patterns detected: * - domain/aggregates/order/Order.ts * - domain/order/Order.ts (aggregate name from parent folder) * - domain/entities/order/Order.ts * * @example * ```typescript * const detector = new AggregateBoundaryDetector() * * // Detect violations in order aggregate * const code = ` * import { User } from '../user/User' * import { UserId } from '../user/value-objects/UserId' * ` * const violations = detector.detectViolations( * code, * 'src/domain/aggregates/order/Order.ts', * 'domain' * ) * * // violations will contain 1 violation for direct User entity import * // but not for UserId (value object is allowed) * console.log(violations.length) // 1 * ``` */ export declare class AggregateBoundaryDetector implements IAggregateBoundaryDetector { private readonly folderRegistry; private readonly pathAnalyzer; private readonly importValidator; constructor(); /** * Detects aggregate boundary violations in the given code * * Analyzes import statements to identify direct entity references * across aggregate boundaries in the domain layer. * * @param code - Source code to analyze * @param filePath - Path to the file being analyzed * @param layer - The architectural layer of the file (should be 'domain') * @returns Array of detected aggregate boundary violations */ detectViolations(code: string, filePath: string, layer: string | undefined): AggregateBoundaryViolation[]; /** * Checks if a file path belongs to an aggregate * * Extracts aggregate name from paths like: * - domain/aggregates/order/Order.ts → 'order' * - domain/order/Order.ts → 'order' * - domain/entities/order/Order.ts → 'order' * * @param filePath - The file path to check * @returns The aggregate name if found, undefined otherwise */ extractAggregateFromPath(filePath: string): string | undefined; /** * Checks if an import path references an entity from another aggregate * * @param importPath - The import path to analyze * @param currentAggregate - The aggregate of the current file * @returns True if the import crosses aggregate boundaries inappropriately */ isAggregateBoundaryViolation(importPath: string, currentAggregate: string): boolean; /** * Analyzes all imports in code and detects violations */ private analyzeImports; /** * Checks a single import for boundary violations */ private checkImport; } //# sourceMappingURL=AggregateBoundaryDetector.d.ts.map