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:
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");
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user