import { describe, expect, it } from "vitest"; import { DEFAULT_DEV_STATE_DIR, createDevRunnerEnv, parseDevRunnerArgs, } from "./dev-runner.mjs"; describe("parseDevRunnerArgs", () => { it("maps supported server flags to env overrides and keeps other flags for turbo", () => { const parsed = parseDevRunnerArgs([ "--", "--state-dir", "~/alt-state", "--token=abc123", "--no-browser=false", "--dry-run", "--continue", ]); expect(parsed.isDryRun).toBe(true); expect(parsed.envOverrides).toEqual({ T3CODE_STATE_DIR: "~/alt-state", T3CODE_AUTH_TOKEN: "abc123", T3CODE_NO_BROWSER: "0", }); expect(parsed.turboArgs).toEqual(["--continue"]); }); it("throws when a value flag is missing its value", () => { expect(() => parseDevRunnerArgs(["--state-dir"])).toThrow("Missing value for --state-dir"); }); it("throws when a value flag is followed by another flag token", () => { expect(() => parseDevRunnerArgs(["--state-dir", "--continue"])).toThrow( "Missing value for --state-dir", ); }); }); describe("createDevRunnerEnv", () => { it("defaults state dir to ~/.t3/dev when not provided", () => { const env = createDevRunnerEnv({ mode: "dev", env: {}, offset: 0, envOverrides: {}, }); expect(env.T3CODE_STATE_DIR).toBe(DEFAULT_DEV_STATE_DIR); }); it("uses existing env state dir when --state-dir is not provided", () => { const env = createDevRunnerEnv({ mode: "dev:server", env: { T3CODE_STATE_DIR: "/tmp/existing-state" }, offset: 0, envOverrides: {}, }); expect(env.T3CODE_STATE_DIR).toBe("/tmp/existing-state"); }); it("lets --state-dir override existing env state dir", () => { const env = createDevRunnerEnv({ mode: "dev:server", env: { T3CODE_STATE_DIR: "/tmp/existing-state" }, offset: 0, envOverrides: { T3CODE_STATE_DIR: "/tmp/override-state" }, }); expect(env.T3CODE_STATE_DIR).toBe("/tmp/override-state"); }); it("treats whitespace-only --state-dir as missing and falls back to env/default", () => { const env = createDevRunnerEnv({ mode: "dev:server", env: { T3CODE_STATE_DIR: "/tmp/existing-state" }, offset: 0, envOverrides: { T3CODE_STATE_DIR: " " }, }); expect(env.T3CODE_STATE_DIR).toBe("/tmp/existing-state"); }); it("recomputes websocket url when port is overridden", () => { const env = createDevRunnerEnv({ mode: "dev", env: {}, offset: 0, envOverrides: { T3CODE_PORT: "4222" }, }); expect(env.T3CODE_PORT).toBe("4222"); expect(env.VITE_WS_URL).toBe("ws://localhost:4222"); }); it("keeps explicitly forwarded web-mode flags", () => { const env = createDevRunnerEnv({ mode: "dev", env: { T3CODE_AUTH_TOKEN: "desktop-token", }, offset: 0, envOverrides: { T3CODE_NO_BROWSER: "1", T3CODE_AUTH_TOKEN: "cli-token", }, }); expect(env.T3CODE_NO_BROWSER).toBe("1"); expect(env.T3CODE_AUTH_TOKEN).toBe("cli-token"); }); it("fails fast for invalid port overrides", () => { expect(() => createDevRunnerEnv({ mode: "dev", env: {}, offset: 0, envOverrides: { T3CODE_PORT: "not-a-port" }, }), ).toThrow("Invalid T3CODE_PORT override"); }); });