diff --git a/docs/superpowers/plans/2026-09-09-unifi-site-manager-integration.md b/docs/superpowers/plans/2026-09-09-unifi-site-manager-integration.md index d7b81cdd4..4f8c5f341 100644 --- a/docs/superpowers/plans/2026-09-09-unifi-site-manager-integration.md +++ b/docs/superpowers/plans/2026-09-09-unifi-site-manager-integration.md @@ -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 `. **Jamais `pnpm vitest run` seul** sur des modules qui atteignent `@homarr/common/server` sans garde d'environnement. +- **Tests :** `pnpm test `. 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 `. - **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"); });