feat(frontend): produire un bundle web distinct en transport http (#74 F1)

Le transport est figé au build par Vite : un seul `dist` ne peut pas servir
à la fois le desktop (IPC Tauri) et le navigateur (HTTP+WS). Le serveur
embarqué servait donc un bundle desktop, d'où `__TAURI_INTERNALS__ is
undefined` côté navigateur.

- `vite.config.ts` devient une factory `({ mode })` : le mode par défaut émet
  le bundle desktop (`dist`), `--mode web` lit `.env.web` et émet le bundle
  navigateur (`dist-web`).
- `.env.web` porte `VITE_TRANSPORT=http` dans un fichier de mode plutôt qu'en
  préfixe de commande, syntaxe qui n'existe pas sous Windows (bundle NSIS).
- `transport.ts` extrait le prédicat `transportFromEnv()`, partagé par l'app et
  la config de build : le constant `__IDEA_TRANSPORT__` et le transport résolu
  dérivent de la même variable via le même prédicat, ils ne peuvent pas diverger.
- `main.tsx` publie `__IDEA_TRANSPORT__` sur `window` : l'affectation est un
  effet de bord, elle survit à la minification et rend un bundle identifiable
  sans grep d'un symbole minifié. Les deux jeux d'adapters étant présents dans
  les deux bundles, leur présence ne prouve rien.

Le chemin desktop est inchangé : le web reste opt-in.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-17 09:09:33 +02:00
parent 50d237e836
commit a7197fc53b
9 changed files with 118 additions and 21 deletions

View File

@ -3,6 +3,8 @@ import { defineConfig } from "vitest/config";
import react from "@vitejs/plugin-react";
import { fileURLToPath, URL } from "node:url";
import { transportFromEnv } from "./src/app/transport";
// Vitest config for the frontend hexagonal layers (domain/ports/adapters/app).
// jsdom is used so React-Testing-Library can render the DI provider.
export default defineConfig({
@ -12,6 +14,13 @@ export default defineConfig({
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
},
// Mirrors the build constant (#74, F1) through the same predicate, so code
// reading `__IDEA_TRANSPORT__` stays testable.
define: {
__IDEA_TRANSPORT__: JSON.stringify(
transportFromEnv(process.env.VITE_TRANSPORT),
),
},
test: {
environment: "jsdom",
globals: true,