From 974bf83bde981ef1d3b0df2b373724d8f6294561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zachary=20Gu=C3=A9not?= Date: Thu, 10 Sep 2026 10:19:20 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20plan=20=E2=80=94=20ESM-safe=20guard=20t?= =?UTF-8?q?est=20and=20the=20.spec.ts=20inclusion=20constraint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- .../plans/2026-09-09-unifi-site-manager-integration.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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"); });