// Règles d'architecture de l'application (ADR 0007, point 2 ; ADR 0009), // vérifiées par dependency-cruiser dans make test (tests/test_web.sh). // Les chemins sont relatifs au dossier app/. /** @type {import('dependency-cruiser').IConfiguration} */ module.exports = { forbidden: [ { name: "domain-is-pure", comment: "Le domaine n'importe que le domaine : ni le moteur (src/engine), ni " + "l'interface (src/ui), ni Node, ni bibliothèque, ni code du navigateur. " + "Il décrit ce dont il a besoin (interface Engine) ; les adaptateurs " + "l'implémentent.", severity: "error", from: { path: "^src/domain/" }, to: { pathNot: "^src/domain/" }, }, { name: "ui-does-not-call-engine", comment: "Aucun écran n'appelle le moteur directement : l'interface passe par le domaine.", severity: "error", from: { path: "^src/ui/" }, to: { path: "^src/engine/" }, }, { name: "only-main-assembles", comment: "Seul le point d'entrée (src/main.ts) assemble l'application : hors de " + "leur propre dossier, le moteur (src/engine), le stockage (src/storage) " + "et l'interface (src/ui) ne sont importés que par lui, et par les tests.", severity: "error", // $1 : le dossier de l'importateur (correspondance de groupe). from: { path: "^src/([^/]+)/" }, to: { path: "^src/(engine|storage|ui)/", pathNot: "^src/$1/" }, }, { name: "nothing-imports-main", comment: "Le point d'entrée n'est importé par personne.", severity: "error", from: {}, to: { path: "^src/main\\.ts$" }, }, { name: "no-circular", comment: "Pas de dépendance circulaire.", severity: "error", from: {}, to: { circular: true }, }, ], options: { // Les imports de types comptent aussi : ils disparaissent à la // compilation, mais créent bien une dépendance dans le code source. tsPreCompilationDeps: true, // Résolution des imports comme TypeScript : « ./events.js » désigne // le fichier events.ts. Le tsconfig.json est celui du dossier courant. tsConfig: { fileName: "tsconfig.json" }, }, };