L'application est à la racine du site : plateau en SVG, saisie au toucher (pion puis case d'arrivée, proposées à partir du moteur), boutons du jet, du videau et de nouvelle partie, coup de l'ordinateur affiché avec son temps, fin de partie, reprise depuis localStorage, aide lue dans les copies de docs/. Le moteur tourne dans le Web Worker existant ; main.ts est le seul assembleur (nouvelles règles dependency-cruiser). Le service worker met tout le site en cache, avec une empreinte du contenu comme version. Les pages de test du moteur passent sous /moteur/. Politique de sécurité du contenu dans le Caddyfile ; make test-browser joue une partie dans Chromium et Firefox sans écran (Playwright, hors de make test). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
62 lines
2.5 KiB
JavaScript
62 lines
2.5 KiB
JavaScript
// 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" },
|
|
},
|
|
};
|