docs: plan — ESM-safe guard test and the .spec.ts inclusion constraint

Scan pré-vol. Le test de garde du bundle client lisait son source via
__dirname, qui n'existe pas en ESM et n'est utilisé par aucun autre spec
du dépôt. Remplacé par import.meta.url, avec la directive d'environnement
node puisqu'il lit le disque et que le défaut est jsdom.

Ajouté aux contraintes globales : vitest n'inclut que **/*.spec.ts, donc
un fichier .spec.tsx ne serait jamais exécuté et son absence passerait
pour un succès.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
zacharyandClaude Opus 5 committed 2026-09-13 22:21:43 +02:00
1 parent 896c60df55
commit 974bf83bde
1 file changed
+5 -3
@@ -16,7 +16,7 @@
- **Environnement — obligatoire.** Avant TOUTE commande `pnpm`/`node`, dans chaque shell :
`cd /home/zachary/Dev/homarr && source .superpowers/sdd/2026-09-08-unifi-os-integration/env.sh`
Sans ça, pnpm s'arrête sur `ERR_PNPM_UNSUPPORTED_ENGINE` (le Node par défaut du poste est trop ancien). Les dépendances sont installées ; ne pas lancer `pnpm install`.
- **Tests :** `pnpm test <chemin>`. **Jamais `pnpm vitest run` seul** sur des modules qui atteignent `@homarr/common/server` sans garde d'environnement.
- **Tests :** `pnpm test <chemin>`. L'environnement vitest par défaut est **jsdom** et le motif d'inclusion est `**/*.spec.ts` — **pas `.spec.tsx`**. Tout fichier de test doit donc porter l'extension `.ts`. **Jamais `pnpm vitest run` seul** sur des modules qui atteignent `@homarr/common/server` sans garde d'environnement.
- **Lint / format :** oxlint et oxfmt. **Ne jamais lancer `pnpm format`** — il reformate tout le dépôt et crée de la dérive dans des paquets étrangers. Formater uniquement ses fichiers : `node_modules/.bin/oxfmt <fichiers>`.
- **zod :** `import { z } from "zod/v4"`. Objets d'API en `z.looseObject` — Ubiquiti ajoute des champs sans prévenir.
- **`unifi-site-manager-types.ts` ne doit JAMAIS importer `@homarr/common/server`**, ni rien qui y mène. Il est réexporté par `packages/integrations/src/types.ts`, lui-même importé par des composants client ; un import serveur y traîne `ioredis` puis `node:dns` dans le bundle navigateur et **empêche l'application de démarrer**. Un test de garde le vérifie (tâche 2).
@@ -190,8 +190,8 @@ Le cœur testable. Aucun réseau, donc aucun mock.
Créer `packages/integrations/src/unifi-site-manager/test/unifi-site-manager-types.spec.ts` :
```ts
// @vitest-environment node
import { readFileSync } from "node:fs";
import { join } from "node:path";
import { describe, expect, test } from "vitest";
import {
@@ -442,7 +442,9 @@ describe("mapSites", () => {
*/
describe("client bundle safety", () => {
test("the types module does not import server-only code", () => {
const source = readFileSync(join(__dirname, "..", "unifi-site-manager-types.ts"), "utf8");
// `import.meta.url` plutôt que `__dirname` : ce dernier n'existe pas en ESM,
// et aucun autre spec du dépôt ne s'y fie.
const source = readFileSync(new URL("../unifi-site-manager-types.ts", import.meta.url), "utf8");
expect(source).not.toContain("@homarr/common/server");
});