import { mkdtempSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; import { build } from "vite"; import { describe, expect, test } from "vitest"; describe("production mock graph", () => { test("excludes the browser mock module from the production bundle", async () => { // Given const outDir = mkdtempSync(join(tmpdir(), "ai-character-admin-prod-")); const previousNodeEnv = process.env.NODE_ENV; try { process.env.NODE_ENV = "production"; // When await build({ build: { emptyOutDir: true, outDir }, configFile: "vite.config.ts", logLevel: "silent", mode: "production", }); const outputFiles = collectFiles(outDir); const output = outputFiles .filter((filePath) => filePath.endsWith(".js")) .map((filePath) => readFileSync(filePath, "utf8")) .join("\n"); // Then expect(outputFiles.some((filePath) => filePath.endsWith("mockServiceWorker.js"))).toBe(false); expect(output).not.toContain("mockServiceWorker.js"); expect(output).not.toContain("startMockWorker"); } finally { process.env.NODE_ENV = previousNodeEnv; rmSync(outDir, { force: true, recursive: true }); } }); }); function collectFiles(directory: string): readonly string[] { return readdirSync(directory).flatMap((entry) => { const path = join(directory, entry); return statSync(path).isDirectory() ? collectFiles(path) : [path]; }); }