ddd-ts-kit/ports-implements-never-extends
Identifiant d'architecture : ports/implements-never-extends. Sévérité par défaut : error dans recommended, error dans strict.
S'applique à : chaque fichier passé au lint.
Pourquoi
Section intitulée « Pourquoi »Un adaptateur honore un contrat ; il n'en hérite pas. implements laisse le compilateur vérifier l'adaptateur par rapport au port et garde le port sans comportement, pour qu'un fake, une classe en mémoire et un client distant soient interchangeables. extends fait du port une classe de base et y attache chaque adaptateur.
- une classe portant
@Repository(Port, ..),@Gateway(Port, ..)ou@Adapter(Port, ..)qui n'écrit pasimplements Port, ou qui écritextends Port - la classe donnée à
bind(Port).toClass(Class, ..)ou àrebind(Port).toClass(Class, ..)qui n'implémente pasPort, ou qui l'étend - sous
infrastructure/d'un contexte : une classe qui étend (extends) une classe importée d'un fichier de port
Incorrect :
@Repository(InvoiceRepository)export class KnexInvoiceRepository extends InvoiceRepository { constructor(private readonly database: Database) {}}
builder.bind(PaymentGateway).toClass(StripePaymentGateway, [PaymentSettings]);// où : export class StripePaymentGateway {}Correct :
@Repository(InvoiceRepository)export class KnexInvoiceRepository implements InvoiceRepository { constructor(private readonly database: Database) {}}
export class StripePaymentGateway implements PaymentGateway {}La classe donnée à toClass est cherchée dans le fichier analysé, puis dans le fichier d'où elle est importée par un chemin relatif ou l'alias d'import : ce fichier est lu sur le disque et analysé sans les types. Quand elle est introuvable (une classe d'un package, un barrel, un export qui renomme), rien n'est signalé. Une classe liée à elle-même (bind(Registry).toClass(Registry)) n'est pas un port et n'est pas jugée. Les fichiers de port sont domain/repositories/*.repository.ts et application/ports/*.port.ts.
Aucune.
rules."ports/implements-never-extends" à off dans ddd-ts-kit.config.json désactive la règle, et // ddd-ts-kit-disable-next-line ports/implements-never-extends -- <reason> désactive une ligne, exactement comme pour ddd-ts-kit check.
implementsest comparé par nom :implements kernel.Clockpour un port nomméClockn'est pas reconnu ; importez le port par son nom.- Un adaptateur qui étend son port par une classe intermédiaire d'un autre fichier n'est pas vu : les décorateurs le refusent au chargement du fichier.
Avec le checker de la CLI
Section intitulée « Avec le checker de la CLI »ddd-ts-kit check signale le même identifiant à partir du texte des fichiers. Cette règle fait autorité pour le code.