/** * @angular-modernizer/plugin-angular - DTO Direct Instantiation Rule * * Detects direct `new X()` instantiation of DTO/Response/Result classes that * should be constructed as typed object literals or via factory functions. * Instantiating these classes directly bypasses type-safety checks and makes * property mapping implicit rather than explicit. * * Detection scope: * - `NewExpression` nodes whose class name matches default suffix patterns * (`.*Response`, `.*Dto`, `.*Result`) — Tier 1, name-based. * - `NewExpression` nodes whose resolved class declaration extends a configured * base class or carries a configured decorator — Tier 2, AST-based. * - Explicit class names registered in `explicitClassNames` — Tier 1, O(1). * * Skipped: * - `.d.ts` declaration files. * - Class names that do not match any configured Tier 1 or Tier 2 criterion. * * @example * ```typescript * const rule = new DtoDirectInstantiationRule(); * const results = await rule.analyze(createContext(sourceFile, project)); * // results[0].metadata.violationType → 'dto-direct-instantiation' * // results[0].metadata.detectionMechanism → 'classNamePattern' * // results[0].metadata.typeArguments → ['UserDto'] * ``` */ import type { AnalysisRule, AnalysisContext, AnalysisResult } from '@angular-modernizer/plugin-system'; export interface DtoDirectInstantiationConfig { /** Tier 1: regex patterns matched against the class name. */ classNamePatterns: (string | RegExp)[]; /** Tier 1: exact class names for O(1) set lookup. */ explicitClassNames: string[]; /** Tier 2: names in the direct `extends` clause checked after import resolution. */ baseClassNames: string[]; /** Tier 2: decorator names checked after import resolution. */ decoratorNames: string[]; /** Class names that are always excluded regardless of pattern matches (e.g. Angular built-ins). */ excludedClassNames: string[]; } export interface DtoDirectInstantiationMetadata { violationType: 'dto-direct-instantiation'; className: string; detectionTier: 1 | 2; detectionMechanism: 'classNamePattern' | 'explicitClassName' | 'baseClass' | 'decorator'; typeArguments: string[]; } export declare class DtoDirectInstantiationRule implements AnalysisRule { readonly id = "angular:dto-direct-instantiation"; readonly name = "DTO Direct Instantiation"; readonly description = "Detects direct new X() instantiation of DTO/Response/Result classes that should use typed object literals"; readonly severity: "warning"; readonly category = "angular-architecture"; readonly tags: string[]; private readonly config; private readonly detector; constructor(config?: Partial); analyze(context: AnalysisContext): Promise; private extractClassName; } //# sourceMappingURL=dto-direct-instantiation.rule.d.ts.map