From c743239b5e83db7142cccf99dcacba7fd66b1d25 Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Sat, 14 Feb 2026 22:54:58 -0800 Subject: [PATCH] fmt --- apps/server/src/codexAppServerManager.test.ts | 13 +++- apps/server/src/codexAppServerManager.ts | 6 +- apps/server/src/coreServices.ts | 5 +- apps/server/src/git.test.ts | 6 +- apps/server/src/git.ts | 16 +--- apps/server/src/gitManager.test.ts | 13 +--- apps/server/src/gitManager.ts | 50 +++--------- apps/server/src/processRunner.test.ts | 18 ++--- apps/server/src/processRunner.ts | 47 +++-------- apps/server/src/ptyAdapter.ts | 12 +-- apps/server/src/terminalManager.test.ts | 31 ++++---- apps/server/src/terminalManager.ts | 32 ++------ apps/server/src/wsServer.test.ts | 8 +- apps/web/src/components/BranchToolbar.tsx | 7 +- apps/web/src/components/ChatView.tsx | 4 +- .../GitActionsControl.logic.test.ts | 27 +++++-- .../src/components/GitActionsControl.logic.ts | 26 ++++--- apps/web/src/components/GitActionsControl.tsx | 33 ++++---- .../src/components/ThreadTerminalDrawer.tsx | 31 ++++---- apps/web/src/components/ui/alert-dialog.tsx | 48 +++--------- apps/web/src/components/ui/alert.tsx | 16 +--- apps/web/src/components/ui/autocomplete.tsx | 77 ++++--------------- apps/web/src/components/ui/badge.tsx | 12 +-- apps/web/src/components/ui/card.tsx | 72 +++-------------- apps/web/src/components/ui/command.tsx | 67 +++------------- apps/web/src/components/ui/dialog.tsx | 25 ++---- apps/web/src/components/ui/empty.tsx | 19 +---- apps/web/src/components/ui/field.tsx | 21 +---- apps/web/src/components/ui/fieldset.tsx | 5 +- apps/web/src/components/ui/input-group.tsx | 14 +--- apps/web/src/components/ui/input.tsx | 8 +- apps/web/src/components/ui/label.tsx | 6 +- apps/web/src/components/ui/menu.tsx | 26 ++----- apps/web/src/components/ui/popover.tsx | 17 +--- apps/web/src/components/ui/scroll-area.tsx | 8 +- apps/web/src/components/ui/separator.tsx | 6 +- apps/web/src/components/ui/sheet.tsx | 10 +-- apps/web/src/components/ui/spinner.tsx | 5 +- apps/web/src/components/ui/textarea.tsx | 10 +-- apps/web/src/components/ui/toast.tsx | 37 ++------- apps/web/src/persistenceSchema.test.ts | 16 +--- apps/web/src/persistenceSchema.ts | 19 +++-- apps/web/src/store.test.ts | 6 +- apps/web/src/store.ts | 39 +++------- apps/web/src/terminal-links.test.ts | 5 +- apps/web/src/terminal-shortcuts.test.ts | 51 ++++-------- apps/web/src/terminal-shortcuts.ts | 8 +- packages/contracts/src/git.test.ts | 4 +- packages/contracts/src/git.ts | 18 +---- packages/contracts/src/ipc.ts | 4 +- packages/contracts/src/terminal.ts | 7 +- 51 files changed, 289 insertions(+), 782 deletions(-) diff --git a/apps/server/src/codexAppServerManager.test.ts b/apps/server/src/codexAppServerManager.test.ts index e9d384594cddbd64a3461147e01c3b0dee309c3e..4a97814a73080a72532e2204dfc5c306a2be8ee5 100644 --- a/apps/server/src/codexAppServerManager.test.ts +++ b/apps/server/src/codexAppServerManager.test.ts @@ -21,10 +21,16 @@ function createSendTurnHarness() { }; const requireSession = vi - .spyOn(manager as unknown as { requireSession: (sessionId: string) => unknown }, "requireSession") + .spyOn( + manager as unknown as { requireSession: (sessionId: string) => unknown }, + "requireSession", + ) .mockReturnValue(context); const sendRequest = vi - .spyOn(manager as unknown as { sendRequest: (...args: unknown[]) => Promise }, "sendRequest") + .spyOn( + manager as unknown as { sendRequest: (...args: unknown[]) => Promise }, + "sendRequest", + ) .mockResolvedValue({ turn: { id: "turn_1", @@ -109,7 +115,8 @@ describe("isRecoverableThreadResumeError", () => { describe("sendTurn", () => { it("sends text and image user input items to turn/start", async () => { - const { manager, context, requireSession, sendRequest, updateSession } = createSendTurnHarness(); + const { manager, context, requireSession, sendRequest, updateSession } = + createSendTurnHarness(); const result = await manager.sendTurn({ sessionId: "sess_1", diff --git a/apps/server/src/codexAppServerManager.ts b/apps/server/src/codexAppServerManager.ts index 0a1d61c098ae6fcf0d9af3e3804904797536c7a2..27da26fb0bfdf8a522ab138746a2513d54a9eab4 100644 --- a/apps/server/src/codexAppServerManager.ts +++ b/apps/server/src/codexAppServerManager.ts @@ -258,8 +258,7 @@ export class CodexAppServerManager extends EventEmitter = []; if (input.input) { turnInput.push({ @@ -283,8 +282,7 @@ export class CodexAppServerManager extends EventEmitter; model?: string; effort?: string; diff --git a/apps/server/src/coreServices.ts b/apps/server/src/coreServices.ts index 1f123b17cf7ab251d0cb14a4b27545b24ed2e673..887ff36a4bcc0718357ba631d899b84ccbb49a2f 100644 --- a/apps/server/src/coreServices.ts +++ b/apps/server/src/coreServices.ts @@ -28,8 +28,5 @@ export interface TextGenerationService { generateCommitMessage( input: CommitMessageGenerationInput, ): Promise; - generatePrContent( - input: PrContentGenerationInput, - ): Promise; + generatePrContent(input: PrContentGenerationInput): Promise; } - diff --git a/apps/server/src/git.test.ts b/apps/server/src/git.test.ts index 2f091b2bb9ec959a0bc5a8d09d86d09e749a4121..d20825bc93c39ef73f4b5b44c74ec103bf4a8a8c 100644 --- a/apps/server/src/git.test.ts +++ b/apps/server/src/git.test.ts @@ -570,11 +570,7 @@ describe("git integration", () => { expect(context!.stagedSummary.length).toBeGreaterThan(0); expect(context!.stagedPatch.length).toBeGreaterThan(0); - const created = await core.commit( - tmp.path, - "Add README update", - "- include updated content", - ); + const created = await core.commit(tmp.path, "Add README update", "- include updated content"); expect(created.commitSha.length).toBeGreaterThan(0); expect(await git(tmp.path, "log -1 --pretty=%s")).toBe("Add README update"); }); diff --git a/apps/server/src/git.ts b/apps/server/src/git.ts index eab1805a5c4f6b03de3038d1533bc2a3e62c2152..0065e15b3beae2b878720fa4cfff01ec279fa6a1 100644 --- a/apps/server/src/git.ts +++ b/apps/server/src/git.ts @@ -101,7 +101,8 @@ function parseNumstatEntries( for (const line of stdout.split(/\r?\n/g)) { if (line.trim().length === 0) continue; const [addedRaw, deletedRaw, ...pathParts] = line.split("\t"); - const rawPath = pathParts.length > 1 ? (pathParts.at(-1) ?? "").trim() : pathParts.join("\t").trim(); + const rawPath = + pathParts.length > 1 ? (pathParts.at(-1) ?? "").trim() : pathParts.join("\t").trim(); if (rawPath.length === 0) continue; const added = Number.parseInt(addedRaw ?? "0", 10); const deleted = Number.parseInt(deletedRaw ?? "0", 10); @@ -311,21 +312,12 @@ export class GitCoreService { async prepareCommitContext(cwd: string): Promise { await this.git(cwd, ["add", "-A"]); - const stagedSummary = await this.gitStdout(cwd, [ - "diff", - "--cached", - "--name-status", - ]); + const stagedSummary = await this.gitStdout(cwd, ["diff", "--cached", "--name-status"]); if (trimStdout(stagedSummary).length === 0) { return null; } - const stagedPatch = await this.gitStdout(cwd, [ - "diff", - "--cached", - "--patch", - "--minimal", - ]); + const stagedPatch = await this.gitStdout(cwd, ["diff", "--cached", "--patch", "--minimal"]); return { stagedSummary, diff --git a/apps/server/src/gitManager.test.ts b/apps/server/src/gitManager.test.ts index 13d5baafdeb060894cc2be34b16ed1de19391008..f2d399c8b8762a023be50147826264d77a0f1910 100644 --- a/apps/server/src/gitManager.test.ts +++ b/apps/server/src/gitManager.test.ts @@ -5,11 +5,7 @@ import path from "node:path"; import { afterEach, describe, expect, it } from "vitest"; import { GitManager } from "./gitManager"; -import { - type ProcessRunOptions, - type ProcessRunResult, - runProcess, -} from "./processRunner"; +import { type ProcessRunOptions, type ProcessRunResult, runProcess } from "./processRunner"; interface FakeGhScenario { prListSequence?: string[]; @@ -71,9 +67,7 @@ async function createBareRemote(): Promise { return remoteDir; } -function createTextGenerator( - overrides: Partial = {}, -): FakeGitTextGenerator { +function createTextGenerator(overrides: Partial = {}): FakeGitTextGenerator { return { generateCommitMessage: async () => ({ subject: "Implement stacked git actions", @@ -126,8 +120,7 @@ function createRunnerWithFakeGh(scenario: FakeGhScenario = {}): { if (args[0] === "pr" && args[1] === "create") { return { stdout: - (scenario.createdPrUrl ?? - "https://github.com/pingdotgg/codething-mvp/pull/101") + "\n", + (scenario.createdPrUrl ?? "https://github.com/pingdotgg/codething-mvp/pull/101") + "\n", stderr: "", code: 0, signal: null, diff --git a/apps/server/src/gitManager.ts b/apps/server/src/gitManager.ts index 91d8ea21239f001d0d03a7974081ca9341d032bd..a9d7689513a0fe0c8fac10763e9374bfa1dda7d1 100644 --- a/apps/server/src/gitManager.ts +++ b/apps/server/src/gitManager.ts @@ -20,11 +20,7 @@ import type { } from "./coreServices"; import { CodexTextGenerator } from "./codexTextGenerator"; import { GitCoreService } from "./git"; -import { - type ProcessRunOptions, - type ProcessRunResult, - runProcess, -} from "./processRunner"; +import { type ProcessRunOptions, type ProcessRunResult, runProcess } from "./processRunner"; const GH_CLI_TIMEOUT_MS = 30_000; @@ -58,11 +54,7 @@ function parseOpenPrList(raw: unknown): OpenPrInfo[] { const url = record.url; const baseRefName = record.baseRefName; const headRefName = record.headRefName; - if ( - typeof number !== "number" || - !Number.isInteger(number) || - number <= 0 - ) { + if (typeof number !== "number" || !Number.isInteger(number) || number <= 0) { continue; } if ( @@ -98,8 +90,7 @@ function sanitizeCommitMessage( ): CommitMessageGenerationResult { const rawSubject = generated.subject.trim().split(/\r?\n/g)[0]?.trim() ?? ""; const subject = rawSubject.replace(/[.]+$/g, "").trim(); - const safeSubject = - subject.length > 0 ? subject.slice(0, 72).trimEnd() : "Update project files"; + const safeSubject = subject.length > 0 ? subject.slice(0, 72).trimEnd() : "Update project files"; return { subject: safeSubject, body: generated.body.trim(), @@ -143,10 +134,7 @@ function extractBranchFromRef(ref: string): string { return normalized.slice(firstSlash + 1).trim(); } -function asCommandNotFound( - command: string, - error: unknown, -): Error | undefined { +function asCommandNotFound(command: string, error: unknown): Error | undefined { if (!(error instanceof Error)) return undefined; if (!error.message.includes(`Command not found: ${command}`)) return undefined; if (command === "gh") { @@ -226,9 +214,7 @@ export class GitManager { }; } - async runStackedAction( - raw: GitRunStackedActionInput, - ): Promise { + async runStackedAction(raw: GitRunStackedActionInput): Promise { const input = gitRunStackedActionInputSchema.parse(raw); const wantsPush = input.action !== "commit"; const wantsPr = input.action === "commit_push_pr"; @@ -241,11 +227,7 @@ export class GitManager { throw new Error("Cannot create a pull request from detached HEAD."); } - const commit = await this.runCommitStep( - input.cwd, - initialStatus.branch, - input.commitMessage, - ); + const commit = await this.runCommitStep(input.cwd, initialStatus.branch, input.commitMessage); const push = wantsPush ? await this.gitCore.pushCurrentBranch(input.cwd, initialStatus.branch) @@ -353,10 +335,7 @@ export class GitManager { throw asCommandNotFound("codex", error) ?? error; } - const bodyFile = path.join( - os.tmpdir(), - `t3code-pr-body-${process.pid}-${randomUUID()}.md`, - ); + const bodyFile = path.join(os.tmpdir(), `t3code-pr-body-${process.pid}-${randomUUID()}.md`); await fs.writeFile(bodyFile, generated.body, "utf8"); try { @@ -401,10 +380,7 @@ export class GitManager { }; } - private async findOpenPr( - cwd: string, - branch: string, - ): Promise { + private async findOpenPr(cwd: string, branch: string): Promise { const stdout = await this.runGhStdout(cwd, [ "pr", "list", @@ -437,10 +413,7 @@ export class GitManager { branch: string, upstreamRef: string | null, ): Promise { - const configured = await this.gitCore.readConfigValue( - cwd, - `branch.${branch}.gh-merge-base`, - ); + const configured = await this.gitCore.readConfigValue(cwd, `branch.${branch}.gh-merge-base`); if (configured) return configured; if (upstreamRef) { @@ -477,10 +450,7 @@ export class GitManager { return result.stdout; } - private async runGhCommand( - cwd: string, - args: readonly string[], - ): Promise { + private async runGhCommand(cwd: string, args: readonly string[]): Promise { try { return await this.run("gh", args, { cwd, diff --git a/apps/server/src/processRunner.test.ts b/apps/server/src/processRunner.test.ts index f7756ac95ea71ea08ab09884bb025f3a3fdf58ca..dd909116d4d6a90739cb806a663e909865d7cfa3 100644 --- a/apps/server/src/processRunner.test.ts +++ b/apps/server/src/processRunner.test.ts @@ -5,23 +5,15 @@ import { runProcess } from "./processRunner"; describe("runProcess", () => { it("fails when output exceeds max buffer in default mode", async () => { await expect( - runProcess( - "node", - ["-e", "process.stdout.write('x'.repeat(2048))"], - { maxBufferBytes: 128 }, - ), + runProcess("node", ["-e", "process.stdout.write('x'.repeat(2048))"], { maxBufferBytes: 128 }), ).rejects.toThrow("exceeded stdout buffer limit"); }); it("truncates output when outputMode is truncate", async () => { - const result = await runProcess( - "node", - ["-e", "process.stdout.write('x'.repeat(2048))"], - { - maxBufferBytes: 128, - outputMode: "truncate", - }, - ); + const result = await runProcess("node", ["-e", "process.stdout.write('x'.repeat(2048))"], { + maxBufferBytes: 128, + outputMode: "truncate", + }); expect(result.code).toBe(0); expect(result.stdout.length).toBeLessThanOrEqual(128); diff --git a/apps/server/src/processRunner.ts b/apps/server/src/processRunner.ts index cb6e9f89e2da9e5362ed87a6ea16ce45e60876c8..858da5ae3f4279f2334ae50976df77e339122cf7 100644 --- a/apps/server/src/processRunner.ts +++ b/apps/server/src/processRunner.ts @@ -24,11 +24,7 @@ function commandLabel(command: string, args: readonly string[]): string { return [command, ...args].join(" "); } -function normalizeSpawnError( - command: string, - args: readonly string[], - error: unknown, -): Error { +function normalizeSpawnError(command: string, args: readonly string[], error: unknown): Error { if (!(error instanceof Error)) { return new Error(`Failed to run ${commandLabel(command, args)}.`); } @@ -38,9 +34,7 @@ function normalizeSpawnError( return new Error(`Command not found: ${command}`); } - return new Error( - `Failed to run ${commandLabel(command, args)}: ${error.message}`, - ); + return new Error(`Failed to run ${commandLabel(command, args)}: ${error.message}`); } function normalizeExitError( @@ -56,17 +50,11 @@ function normalizeExitError( return new Error(`${commandLabel(command, args)} ${reason}.${detail}`); } -function normalizeStdinError( - command: string, - args: readonly string[], - error: unknown, -): Error { +function normalizeStdinError(command: string, args: readonly string[], error: unknown): Error { if (!(error instanceof Error)) { return new Error(`Failed to write stdin for ${commandLabel(command, args)}.`); } - return new Error( - `Failed to write stdin for ${commandLabel(command, args)}: ${error.message}`, - ); + return new Error(`Failed to write stdin for ${commandLabel(command, args)}: ${error.message}`); } function normalizeBufferError( @@ -161,22 +149,13 @@ export async function runProcess( }); }; - const appendOutput = ( - stream: "stdout" | "stderr", - chunk: Buffer | string, - ): Error | null => { - const chunkBuffer = - typeof chunk === "string" ? Buffer.from(chunk) : chunk; + const appendOutput = (stream: "stdout" | "stderr", chunk: Buffer | string): Error | null => { + const chunkBuffer = typeof chunk === "string" ? Buffer.from(chunk) : chunk; const text = chunkBuffer.toString(); const byteLength = chunkBuffer.length; if (stream === "stdout") { if (outputMode === "truncate") { - const appended = appendChunkWithinLimit( - stdout, - stdoutBytes, - chunkBuffer, - maxBufferBytes, - ); + const appended = appendChunkWithinLimit(stdout, stdoutBytes, chunkBuffer, maxBufferBytes); stdout = appended.next; stdoutBytes = appended.nextBytes; stdoutTruncated = stdoutTruncated || appended.truncated; @@ -189,12 +168,7 @@ export async function runProcess( } } else { if (outputMode === "truncate") { - const appended = appendChunkWithinLimit( - stderr, - stderrBytes, - chunkBuffer, - maxBufferBytes, - ); + const appended = appendChunkWithinLimit(stderr, stderrBytes, chunkBuffer, maxBufferBytes); stderr = appended.next; stderrBytes = appended.nextBytes; stderrTruncated = stderrTruncated || appended.truncated; @@ -241,10 +215,7 @@ export async function runProcess( }; finalize(() => { - if ( - !options.allowNonZeroExit && - (timedOut || (code !== null && code !== 0)) - ) { + if (!options.allowNonZeroExit && (timedOut || (code !== null && code !== 0))) { reject(normalizeExitError(command, args, result)); return; } diff --git a/apps/server/src/ptyAdapter.ts b/apps/server/src/ptyAdapter.ts index 104a0648b92fd9ab2acf2cb91324851d83374677..903b5911b13e8e77631fbe02448b1537243a07eb 100644 --- a/apps/server/src/ptyAdapter.ts +++ b/apps/server/src/ptyAdapter.ts @@ -40,12 +40,7 @@ function resolveNodePtySpawnHelperPath(): string | null { const candidates = [ path.join(packageDir, "build", "Release", "spawn-helper"), path.join(packageDir, "build", "Debug", "spawn-helper"), - path.join( - packageDir, - "prebuilds", - `${process.platform}-${process.arch}`, - "spawn-helper", - ), + path.join(packageDir, "prebuilds", `${process.platform}-${process.arch}`, "spawn-helper"), ]; for (const candidate of candidates) { @@ -128,10 +123,7 @@ export class NodePtyAdapter implements PtyAdapter { cols: input.cols, rows: input.rows, env: input.env, - name: - globalThis.process.platform === "win32" - ? "xterm-color" - : "xterm-256color", + name: globalThis.process.platform === "win32" ? "xterm-color" : "xterm-256color", }); return new NodePtyProcess(ptyProcess); } diff --git a/apps/server/src/terminalManager.test.ts b/apps/server/src/terminalManager.test.ts index efbd8ce62a2a23df781923ea839bebc6b19fe213..55b11068be618f7e3357b7c9e312cc2e17e12950 100644 --- a/apps/server/src/terminalManager.test.ts +++ b/apps/server/src/terminalManager.test.ts @@ -2,7 +2,11 @@ import fs from "node:fs"; import os from "node:os"; import path from "node:path"; -import { DEFAULT_TERMINAL_ID, type TerminalEvent, type TerminalOpenInput } from "@t3tools/contracts"; +import { + DEFAULT_TERMINAL_ID, + type TerminalEvent, + type TerminalOpenInput, +} from "@t3tools/contracts"; import { afterEach, describe, expect, it } from "vitest"; import type { PtyAdapter, PtyExitEvent, PtyProcess, PtySpawnInput } from "./ptyAdapter"; @@ -161,7 +165,10 @@ describe("TerminalManager", () => { it("spawns lazily and reuses running terminal per thread", async () => { const { manager, ptyAdapter } = makeManager(); - const [first, second] = await Promise.all([manager.open(openInput()), manager.open(openInput())]); + const [first, second] = await Promise.all([ + manager.open(openInput()), + manager.open(openInput()), + ]); const third = await manager.open(openInput()); expect(first.threadId).toBe("thread-1"); @@ -299,18 +306,14 @@ describe("TerminalManager", () => { hasRunningSubprocess = true; await waitFor( () => - events.some( - (event) => event.type === "activity" && event.hasRunningSubprocess === true, - ), + events.some((event) => event.type === "activity" && event.hasRunningSubprocess === true), 1_200, ); hasRunningSubprocess = false; await waitFor( () => - events.some( - (event) => event.type === "activity" && event.hasRunningSubprocess === false, - ), + events.some((event) => event.type === "activity" && event.hasRunningSubprocess === false), 1_200, ); @@ -368,12 +371,8 @@ describe("TerminalManager", () => { expect(defaultProcess.killed).toBe(true); expect(sidecarProcess.killed).toBe(true); - expect(fs.existsSync(multiTerminalHistoryLogPath(logsDir, "thread-1", "default"))).toBe( - false, - ); - expect(fs.existsSync(multiTerminalHistoryLogPath(logsDir, "thread-1", "sidecar"))).toBe( - false, - ); + expect(fs.existsSync(multiTerminalHistoryLogPath(logsDir, "thread-1", "default"))).toBe(false); + expect(fs.existsSync(multiTerminalHistoryLogPath(logsDir, "thread-1", "sidecar"))).toBe(false); manager.dispose(); }); @@ -415,9 +414,7 @@ describe("TerminalManager", () => { } else { expect( ptyAdapter.spawnInputs.some((input) => - ["/bin/zsh", "/bin/bash", "/bin/sh", "zsh", "bash", "sh"].includes( - input.shell, - ), + ["/bin/zsh", "/bin/bash", "/bin/sh", "zsh", "bash", "sh"].includes(input.shell), ), ).toBe(true); } diff --git a/apps/server/src/terminalManager.ts b/apps/server/src/terminalManager.ts index 8e1b39eb839f6b2eeba0cd1e4181899fa1993381..b6fb31af3bb8642134fc7b61705837b38e1b84f5 100644 --- a/apps/server/src/terminalManager.ts +++ b/apps/server/src/terminalManager.ts @@ -26,11 +26,7 @@ import { runProcess } from "./processRunner"; const DEFAULT_HISTORY_LINE_LIMIT = 5_000; const DEFAULT_PERSIST_DEBOUNCE_MS = 40; const DEFAULT_SUBPROCESS_POLL_INTERVAL_MS = 1_000; -const TERMINAL_ENV_BLOCKLIST = new Set([ - "PORT", - "ELECTRON_RENDERER_PORT", - "ELECTRON_RUN_AS_NODE", -]); +const TERMINAL_ENV_BLOCKLIST = new Set(["PORT", "ELECTRON_RENDERER_PORT", "ELECTRON_RUN_AS_NODE"]); type TerminalSubprocessChecker = (terminalPid: number) => Promise; @@ -102,12 +98,7 @@ function resolveShellCandidates(shellResolver: () => string): string[] { const requested = normalizeShellCommand(shellResolver()); if (process.platform === "win32") { - return uniqueShells([ - requested, - process.env.ComSpec ?? null, - "powershell.exe", - "cmd.exe", - ]); + return uniqueShells([requested, process.env.ComSpec ?? null, "powershell.exe", "cmd.exe"]); } return uniqueShells([ @@ -431,11 +422,7 @@ export class TerminalManager extends EventEmitter { const input = terminalCloseInputSchema.parse(raw); await this.runWithThreadLock(input.threadId, async () => { if (input.terminalId) { - await this.closeSession( - input.threadId, - input.terminalId, - input.deleteHistory === true, - ); + await this.closeSession(input.threadId, input.terminalId, input.deleteHistory === true); return; } @@ -517,13 +504,9 @@ export class TerminalManager extends EventEmitter { if (!ptyProcess) { const detail = - lastSpawnError instanceof Error - ? lastSpawnError.message - : "Terminal start failed"; + lastSpawnError instanceof Error ? lastSpawnError.message : "Terminal start failed"; const tried = - shellCandidates.length > 0 - ? ` Tried shells: ${shellCandidates.join(", ")}.` - : ""; + shellCandidates.length > 0 ? ` Tried shells: ${shellCandidates.join(", ")}.` : ""; throw new Error(`${detail}.${tried}`.trim()); } @@ -969,10 +952,7 @@ export class TerminalManager extends EventEmitter { return path.join(this.logsDir, `${legacySafeThreadId(threadId)}.log`); } - private async runWithThreadLock( - threadId: string, - task: () => Promise, - ): Promise { + private async runWithThreadLock(threadId: string, task: () => Promise): Promise { const previous = this.threadLocks.get(threadId) ?? Promise.resolve(); let release: () => void = () => {}; const current = new Promise((resolve) => { diff --git a/apps/server/src/wsServer.test.ts b/apps/server/src/wsServer.test.ts index 1f84d880a40ef454f3d6ebc4a0faa4a8aa026699..baf70eaca2b367a99d7f2b3c218578f3ba1650c2 100644 --- a/apps/server/src/wsServer.test.ts +++ b/apps/server/src/wsServer.test.ts @@ -224,9 +224,7 @@ describe("WebSocket Server", () => { ...(options.authToken ? { authToken: options.authToken } : {}), projectRegistry: new ProjectRegistry(stateDir), ...(options.gitManager ? { gitManager: options.gitManager as never } : {}), - ...(options.terminalManager - ? { terminalManager: options.terminalManager } - : {}), + ...(options.terminalManager ? { terminalManager: options.terminalManager } : {}), }); } @@ -602,9 +600,7 @@ describe("WebSocket Server", () => { it("returns errors from git.runStackedAction", async () => { const gitManager = { status: vi.fn(), - runStackedAction: vi - .fn() - .mockRejectedValue(new Error("Cannot push from detached HEAD.")), + runStackedAction: vi.fn().mockRejectedValue(new Error("Cannot push from detached HEAD.")), }; server = createTestServer({ cwd: "/test", gitManager }); diff --git a/apps/web/src/components/BranchToolbar.tsx b/apps/web/src/components/BranchToolbar.tsx index 9e25228f8eeecdc9056a1bdd3450b92ea828c7a9..b60d38126e4e964f9907aaa03e62fffd2e846788 100644 --- a/apps/web/src/components/BranchToolbar.tsx +++ b/apps/web/src/components/BranchToolbar.tsx @@ -214,13 +214,16 @@ export default function BranchToolbar({ envMode, onEnvModeChange, envLocked }: B const branch = branchByName.get(branchName); if (!branch) return null; - const hasSecondaryWorktree = branch.worktreePath && branch.worktreePath !== activeProject.cwd; + const hasSecondaryWorktree = + branch.worktreePath && branch.worktreePath !== activeProject.cwd; return ( selectBranch(branch)} >
diff --git a/apps/web/src/components/ChatView.tsx b/apps/web/src/components/ChatView.tsx index 9f3f5fb850d21d8e68416a0416ada15d6c0bfdbd..dbb646c2b17f085311fc549c7412ecd1723987dc 100644 --- a/apps/web/src/components/ChatView.tsx +++ b/apps/web/src/components/ChatView.tsx @@ -1304,7 +1304,9 @@ export default function ChatView() {
- {isGitRepo && } + {isGitRepo && ( + + )} {activeThread.terminalOpen && api && activeProject && ( { describe("when: on default branch without open PR", () => { it("resolveQuickAction returns commit and push when local changes exist", () => { - const quick = resolveQuickAction(status({ branch: "main", hasWorkingTreeChanges: true }), false, true); + const quick = resolveQuickAction( + status({ branch: "main", hasWorkingTreeChanges: true }), + false, + true, + ); assert.deepInclude(quick, { kind: "run_action", action: "commit_push", @@ -393,7 +397,11 @@ describe("when: on default branch without open PR", () => { }); it("resolveQuickAction returns push when branch is ahead", () => { - const quick = resolveQuickAction(status({ branch: "main", aheadCount: 2, openPr: null }), false, true); + const quick = resolveQuickAction( + status({ branch: "main", aheadCount: 2, openPr: null }), + false, + true, + ); assert.deepInclude(quick, { kind: "run_action", action: "commit_push", @@ -405,7 +413,10 @@ describe("when: on default branch without open PR", () => { describe("when: working tree has local changes and branch is behind upstream", () => { it("resolveQuickAction still prefers commit, push, and create PR", () => { - const quick = resolveQuickAction(status({ hasWorkingTreeChanges: true, behindCount: 1 }), false); + const quick = resolveQuickAction( + status({ hasWorkingTreeChanges: true, behindCount: 1 }), + false, + ); assert.deepInclude(quick, { kind: "run_action", action: "commit_push_pr", @@ -486,7 +497,10 @@ describe("when: HEAD is detached and there are no local changes", () => { describe("when: branch has no upstream configured", () => { it("resolveQuickAction returns disabled commit state when clean and no commits are ahead", () => { - const quick = resolveQuickAction(status({ hasUpstream: false, openPr: null, aheadCount: 0 }), false); + const quick = resolveQuickAction( + status({ hasUpstream: false, openPr: null, aheadCount: 0 }), + false, + ); assert.deepInclude(quick, { kind: "show_hint", label: "Commit", @@ -540,7 +554,10 @@ describe("when: branch has no upstream configured", () => { }); it("buildMenuItems disables push and create PR when no commits are ahead", () => { - const items = buildMenuItems(status({ hasUpstream: false, openPr: null, aheadCount: 0 }), false); + const items = buildMenuItems( + status({ hasUpstream: false, openPr: null, aheadCount: 0 }), + false, + ); assert.deepEqual(items, [ { id: "commit", diff --git a/apps/web/src/components/GitActionsControl.logic.ts b/apps/web/src/components/GitActionsControl.logic.ts index ea9fd0ea00b3bba2d59c89c3ac0b92761bfd632e..d00fcbc740b5090fa5e45df6649e4d9f64689ac3 100644 --- a/apps/web/src/components/GitActionsControl.logic.ts +++ b/apps/web/src/components/GitActionsControl.logic.ts @@ -1,4 +1,8 @@ -import type { GitRunStackedActionResult, GitStackedAction, GitStatusResult } from "@t3tools/contracts"; +import type { + GitRunStackedActionResult, + GitStackedAction, + GitStatusResult, +} from "@t3tools/contracts"; export type GitActionIconName = "commit" | "push" | "pr"; @@ -29,16 +33,20 @@ function shortenSha(sha: string | undefined): string | null { return sha.slice(0, SHORT_SHA_LENGTH); } -function truncateText(value: string | undefined, maxLength = TOAST_DESCRIPTION_MAX): string | undefined { +function truncateText( + value: string | undefined, + maxLength = TOAST_DESCRIPTION_MAX, +): string | undefined { if (!value) return undefined; if (value.length <= maxLength) return value; if (maxLength <= 3) return "...".slice(0, maxLength); return `${value.slice(0, Math.max(0, maxLength - 3)).trimEnd()}...`; } -export function summarizeGitResult( - result: GitRunStackedActionResult, -): { title: string; description?: string } { +export function summarizeGitResult(result: GitRunStackedActionResult): { + title: string; + description?: string; +} { const withDescription = (title: string, description: string | undefined) => description ? { title, description } : { title }; @@ -79,12 +87,7 @@ export function buildMenuItems( const hasOpenPr = gitStatus.openPr !== null; const isBehind = gitStatus.behindCount > 0; const canCommit = !isBusy && hasChanges; - const canPush = - !isBusy && - hasBranch && - !hasChanges && - !isBehind && - gitStatus.aheadCount > 0; + const canPush = !isBusy && hasBranch && !hasChanges && !isBehind && gitStatus.aheadCount > 0; const canCreatePr = !isBusy && hasBranch && @@ -215,4 +218,3 @@ export function requiresDefaultBranchConfirmation( if (!isDefaultBranch) return false; return action === "commit_push" || action === "commit_push_pr"; } - diff --git a/apps/web/src/components/GitActionsControl.tsx b/apps/web/src/components/GitActionsControl.tsx index 179e9864080476896a1cfe94107604fafc5e2ff7..141e4e1c5b3d0f9facf04954d75d6e1d60303a02 100644 --- a/apps/web/src/components/GitActionsControl.tsx +++ b/apps/web/src/components/GitActionsControl.tsx @@ -1,8 +1,4 @@ -import { - type GitStatusResult, - type GitStackedAction, - type NativeApi, -} from "@t3tools/contracts"; +import { type GitStatusResult, type GitStackedAction, type NativeApi } from "@t3tools/contracts"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useCallback, useMemo, useState } from "react"; import { ChevronDownIcon, CloudUploadIcon, GitCommitIcon, InfoIcon } from "lucide-react"; @@ -195,9 +191,9 @@ export default function GitActionsControl({ api, gitCwd }: GitActionsControlProp ? (quickAction.hint ?? "This action is currently unavailable.") : null; const [isQuickActionPopoverOpen, setIsQuickActionPopoverOpen] = useState(false); - const [openDisabledMenuItemId, setOpenDisabledMenuItemId] = useState( - null, - ); + const [openDisabledMenuItemId, setOpenDisabledMenuItemId] = useState< + GitActionMenuItem["id"] | null + >(null); const refreshGitStatus = useCallback(async () => { if (!api || !gitCwd) return; @@ -240,13 +236,7 @@ export default function GitActionsControl({ api, gitCwd }: GitActionsControlProp }, [api, gitStatus?.openPr?.url]); const runGitActionWithToast = useCallback( - async ({ - action, - commitMessage, - }: { - action: GitStackedAction; - commitMessage?: string; - }) => { + async ({ action, commitMessage }: { action: GitStackedAction; commitMessage?: string }) => { const confirmed = await maybeConfirmPushToDefaultBranch(action); if (!confirmed) return; @@ -396,8 +386,7 @@ export default function GitActionsControl({ api, gitCwd }: GitActionsControlProp : activeDialogAction === "push" ? "commit_push" : "commit_push_pr"; - const commitMessage = - activeDialogAction === "commit" ? dialogCommitMessage.trim() : ""; + const commitMessage = activeDialogAction === "commit" ? dialogCommitMessage.trim() : ""; setActiveDialogAction(null); void runGitActionWithToast({ action, @@ -503,7 +492,11 @@ export default function GitActionsControl({ api, gitCwd }: GitActionsControlProp {gitActionMenuItems.map((item) => { - const disabledReason = getMenuActionDisabledReason(item, gitStatus, isGitActionRunning); + const disabledReason = getMenuActionDisabledReason( + item, + gitStatus, + isGitActionRunning, + ); if (item.disabled && disabledReason) { return ( +{gitStatus.workingTree.insertions} / - -{gitStatus.workingTree.deletions} + + -{gitStatus.workingTree.deletions} + )} diff --git a/apps/web/src/components/ThreadTerminalDrawer.tsx b/apps/web/src/components/ThreadTerminalDrawer.tsx index b1a19087a3a17e1df61bd6f6849c14013d8b0a2d..03b057b2ed76b5e843d8c9c5d63cf6598eade5c1 100644 --- a/apps/web/src/components/ThreadTerminalDrawer.tsx +++ b/apps/web/src/components/ThreadTerminalDrawer.tsx @@ -28,16 +28,11 @@ const MAX_DRAWER_HEIGHT_RATIO = 0.75; function maxDrawerHeight(): number { if (typeof window === "undefined") return DEFAULT_THREAD_TERMINAL_HEIGHT; - return Math.max( - MIN_DRAWER_HEIGHT, - Math.floor(window.innerHeight * MAX_DRAWER_HEIGHT_RATIO), - ); + return Math.max(MIN_DRAWER_HEIGHT, Math.floor(window.innerHeight * MAX_DRAWER_HEIGHT_RATIO)); } function clampDrawerHeight(height: number): number { - const safeHeight = Number.isFinite(height) - ? height - : DEFAULT_THREAD_TERMINAL_HEIGHT; + const safeHeight = Number.isFinite(height) ? height : DEFAULT_THREAD_TERMINAL_HEIGHT; const maxHeight = maxDrawerHeight(); return Math.min(Math.max(Math.round(safeHeight), MIN_DRAWER_HEIGHT), maxHeight); } @@ -51,8 +46,7 @@ function terminalThemeFromApp(): ITheme { const bodyStyles = getComputedStyle(document.body); const background = bodyStyles.backgroundColor || (isDark ? "rgb(14, 18, 24)" : "rgb(255, 255, 255)"); - const foreground = - bodyStyles.color || (isDark ? "rgb(237, 241, 247)" : "rgb(28, 33, 41)"); + const foreground = bodyStyles.color || (isDark ? "rgb(237, 241, 247)" : "rgb(28, 33, 41)"); if (isDark) { return { @@ -146,8 +140,7 @@ function TerminalViewport({ lineHeight: 1.2, fontSize: 12, scrollback: 5_000, - fontFamily: - '"SF Mono", "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace', + fontFamily: '"SF Mono", "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace', theme: terminalThemeFromApp(), }); terminal.loadAddon(fitAddon); @@ -538,8 +531,9 @@ export default function ThreadTerminalDrawer({ return indexByTerminal >= 0 ? indexByTerminal : 0; }, [activeTerminalGroupId, resolvedActiveTerminalId, resolvedTerminalGroups]); - const visibleTerminalIds = - resolvedTerminalGroups[resolvedActiveGroupIndex]?.terminalIds ?? [resolvedActiveTerminalId]; + const visibleTerminalIds = resolvedTerminalGroups[resolvedActiveGroupIndex]?.terminalIds ?? [ + resolvedActiveTerminalId, + ]; const hasTerminalSidebar = normalizedTerminalIds.length > 1; const isSplitView = visibleTerminalIds.length > 1; const showGroupHeaders = @@ -707,9 +701,7 @@ export default function ThreadTerminalDrawer({
{ if (terminalId !== resolvedActiveTerminalId) { @@ -785,7 +777,8 @@ export default function ThreadTerminalDrawer({
{resolvedTerminalGroups.map((terminalGroup, groupIndex) => { - const isGroupActive = terminalGroup.terminalIds.includes(resolvedActiveTerminalId); + const isGroupActive = + terminalGroup.terminalIds.includes(resolvedActiveTerminalId); const groupActiveTerminalId = isGroupActive ? resolvedActiveTerminalId : (terminalGroup.terminalIds[0] ?? resolvedActiveTerminalId); @@ -808,7 +801,9 @@ export default function ThreadTerminalDrawer({ )} -
+
{terminalGroup.terminalIds.map((terminalId) => { const isActive = terminalId === resolvedActiveTerminalId; return ( diff --git a/apps/web/src/components/ui/alert-dialog.tsx b/apps/web/src/components/ui/alert-dialog.tsx index 3c53b4cf3ae5681b343102a999e8ff499fd03cae..5c65f261f59eebdbf2660c6f4dea504a140cfe2f 100644 --- a/apps/web/src/components/ui/alert-dialog.tsx +++ b/apps/web/src/components/ui/alert-dialog.tsx @@ -11,15 +11,10 @@ const AlertDialog = AlertDialogPrimitive.Root; const AlertDialogPortal = AlertDialogPrimitive.Portal; function AlertDialogTrigger(props: AlertDialogPrimitive.Trigger.Props) { - return ( - - ); + return ; } -function AlertDialogBackdrop({ - className, - ...props -}: AlertDialogPrimitive.Backdrop.Props) { +function AlertDialogBackdrop({ className, ...props }: AlertDialogPrimitive.Backdrop.Props) { return ( ) { +function AlertDialogHeader({ className, ...props }: React.ComponentProps<"div">) { return (
@@ -116,26 +99,17 @@ function AlertDialogFooter({ ); } -function AlertDialogTitle({ - className, - ...props -}: AlertDialogPrimitive.Title.Props) { +function AlertDialogTitle({ className, ...props }: AlertDialogPrimitive.Title.Props) { return ( ); } -function AlertDialogDescription({ - className, - ...props -}: AlertDialogPrimitive.Description.Props) { +function AlertDialogDescription({ className, ...props }: AlertDialogPrimitive.Description.Props) { return ( - ); + return ; } export { diff --git a/apps/web/src/components/ui/alert.tsx b/apps/web/src/components/ui/alert.tsx index 8906426d50de6fee189a65df4698524ca67e1553..41013f95b1aa54a53cfd6bc45fdc005aadd7c146 100644 --- a/apps/web/src/components/ui/alert.tsx +++ b/apps/web/src/components/ui/alert.tsx @@ -11,10 +11,8 @@ const alertVariants = cva( }, variants: { variant: { - default: - "bg-transparent dark:bg-input/32 [&>svg]:text-muted-foreground", - error: - "border-destructive/32 bg-destructive/4 [&>svg]:text-destructive", + default: "bg-transparent dark:bg-input/32 [&>svg]:text-muted-foreground", + error: "border-destructive/32 bg-destructive/4 [&>svg]:text-destructive", info: "border-info/32 bg-info/4 [&>svg]:text-info", success: "border-success/32 bg-success/4 [&>svg]:text-success", warning: "border-warning/32 bg-warning/4 [&>svg]:text-warning", @@ -48,16 +46,10 @@ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { ); } -function AlertDescription({ - className, - ...props -}: React.ComponentProps<"div">) { +function AlertDescription({ className, ...props }: React.ComponentProps<"div">) { return (
diff --git a/apps/web/src/components/ui/autocomplete.tsx b/apps/web/src/components/ui/autocomplete.tsx index ec8b862a2e36ec704f87bcc8bdeb22ca7924a6d7..98ad1e431a575fb3c441bc41a3b3514139ff2d72 100644 --- a/apps/web/src/components/ui/autocomplete.tsx +++ b/apps/web/src/components/ui/autocomplete.tsx @@ -121,11 +121,7 @@ function AutocompletePopup({ ); } -function AutocompleteItem({ - className, - children, - ...props -}: AutocompletePrimitive.Item.Props) { +function AutocompleteItem({ className, children, ...props }: AutocompletePrimitive.Item.Props) { return ( ); } -function AutocompleteEmpty({ - className, - ...props -}: AutocompletePrimitive.Empty.Props) { +function AutocompleteEmpty({ className, ...props }: AutocompletePrimitive.Empty.Props) { return ( + ); } function AutocompleteValue({ ...props }: AutocompletePrimitive.Value.Props) { - return ( - - ); + return ; } -function AutocompleteList({ - className, - ...props -}: AutocompletePrimitive.List.Props) { +function AutocompleteList({ className, ...props }: AutocompletePrimitive.List.Props) { return ( @@ -235,10 +201,7 @@ function AutocompleteList({ ); } -function AutocompleteClear({ - className, - ...props -}: AutocompletePrimitive.Clear.Props) { +function AutocompleteClear({ className, ...props }: AutocompletePrimitive.Clear.Props) { return ( - ); +function AutocompleteCollection({ ...props }: AutocompletePrimitive.Collection.Props) { + return ; } function AutocompleteTrigger({ diff --git a/apps/web/src/components/ui/badge.tsx b/apps/web/src/components/ui/badge.tsx index c0f163963c580894bfddf1cad34a54ec9192a180..e06d9b9a0d812fc51471a5695da2fc7fa57f2134 100644 --- a/apps/web/src/components/ui/badge.tsx +++ b/apps/web/src/components/ui/badge.tsx @@ -21,17 +21,13 @@ const badgeVariants = cva( sm: "h-5 min-w-5 rounded-[.25rem] px-[calc(--spacing(1)-1px)] text-xs sm:h-4 sm:min-w-4 sm:text-[.625rem]", }, variant: { - default: - "bg-primary text-primary-foreground [button&,a&]:hover:bg-primary/90", - destructive: - "bg-destructive text-white [button&,a&]:hover:bg-destructive/90", - error: - "bg-destructive/8 text-destructive-foreground dark:bg-destructive/16", + default: "bg-primary text-primary-foreground [button&,a&]:hover:bg-primary/90", + destructive: "bg-destructive text-white [button&,a&]:hover:bg-destructive/90", + error: "bg-destructive/8 text-destructive-foreground dark:bg-destructive/16", info: "bg-info/8 text-info-foreground dark:bg-info/16", outline: "border-input bg-background text-foreground dark:bg-input/32 [button&,a&]:hover:bg-accent/50 dark:[button&,a&]:hover:bg-input/48", - secondary: - "bg-secondary text-secondary-foreground [button&,a&]:hover:bg-secondary/90", + secondary: "bg-secondary text-secondary-foreground [button&,a&]:hover:bg-secondary/90", success: "bg-success/8 text-success-foreground dark:bg-success/16", warning: "bg-warning/8 text-warning-foreground dark:bg-warning/16", }, diff --git a/apps/web/src/components/ui/card.tsx b/apps/web/src/components/ui/card.tsx index 3e4e3dcf48a20a85b41d19530e832201675ef439..f1428d13d9099adbc518bc71ecdc0b158f0022d0 100644 --- a/apps/web/src/components/ui/card.tsx +++ b/apps/web/src/components/ui/card.tsx @@ -5,11 +5,7 @@ import { useRender } from "@base-ui/react/use-render"; import { cn } from "~/lib/utils"; -function Card({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function Card({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn( "relative flex flex-col rounded-2xl border bg-card not-dark:bg-clip-padding text-card-foreground shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)]", @@ -25,11 +21,7 @@ function Card({ }); } -function CardFrame({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardFrame({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn( "[--clip-top:-1rem] [--clip-bottom:-1rem] *:data-[slot=card]:first:[--clip-top:1px] *:data-[slot=card]:last:[--clip-bottom:1px] flex flex-col relative rounded-2xl border bg-card before:bg-muted/72 not-dark:bg-clip-padding text-card-foreground shadow-xs/5 before:pointer-events-none before:absolute before:inset-0 before:rounded-[calc(var(--radius-2xl)-1px)] before:shadow-[0_1px_--theme(--color-black/4%)] dark:before:shadow-[0_-1px_--theme(--color-white/6%)] *:data-[slot=card]:-m-px *:not-last:data-[slot=card]:rounded-b-xl *:not-last:data-[slot=card]:before:rounded-b-[calc(var(--radius-xl)-1px)] *:not-first:data-[slot=card]:rounded-t-xl *:not-first:data-[slot=card]:before:rounded-t-[calc(var(--radius-xl)-1px)] *:data-[slot=card]:[clip-path:inset(var(--clip-top)_1px_var(--clip-bottom)_1px_round_calc(var(--radius-2xl)-1px))] *:data-[slot=card]:shadow-none *:data-[slot=card]:before:hidden *:data-[slot=card]:bg-clip-padding", @@ -45,11 +37,7 @@ function CardFrame({ }); } -function CardFrameHeader({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardFrameHeader({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn("relative flex flex-col px-6 py-4", className), "data-slot": "card-frame-header", @@ -62,11 +50,7 @@ function CardFrameHeader({ }); } -function CardFrameTitle({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardFrameTitle({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn("font-semibold text-sm", className), "data-slot": "card-frame-title", @@ -79,11 +63,7 @@ function CardFrameTitle({ }); } -function CardFrameDescription({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardFrameDescription({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn("text-muted-foreground text-sm", className), "data-slot": "card-frame-description", @@ -96,11 +76,7 @@ function CardFrameDescription({ }); } -function CardFrameFooter({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardFrameFooter({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn("px-6 py-4", className), "data-slot": "card-frame-footer", @@ -113,11 +89,7 @@ function CardFrameFooter({ }); } -function CardHeader({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardHeader({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn( "grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 p-6 in-[[data-slot=card]:has(>[data-slot=card-panel])]:pb-4 has-data-[slot=card-action]:grid-cols-[1fr_auto]", @@ -133,11 +105,7 @@ function CardHeader({ }); } -function CardTitle({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardTitle({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn("font-semibold text-lg leading-none", className), "data-slot": "card-title", @@ -150,11 +118,7 @@ function CardTitle({ }); } -function CardDescription({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardDescription({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn("text-muted-foreground text-sm", className), "data-slot": "card-description", @@ -167,11 +131,7 @@ function CardDescription({ }); } -function CardAction({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardAction({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn( "col-start-2 row-span-2 row-start-1 self-start justify-self-end inline-flex", @@ -187,11 +147,7 @@ function CardAction({ }); } -function CardPanel({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardPanel({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn( "flex-1 p-6 in-[[data-slot=card]:has(>[data-slot=card-header]:not(.border-b))]:pt-0 in-[[data-slot=card]:has(>[data-slot=card-footer]:not(.border-t))]:pb-0", @@ -207,11 +163,7 @@ function CardPanel({ }); } -function CardFooter({ - className, - render, - ...props -}: useRender.ComponentProps<"div">) { +function CardFooter({ className, render, ...props }: useRender.ComponentProps<"div">) { const defaultProps = { className: cn( "flex items-center p-6 in-[[data-slot=card]:has(>[data-slot=card-panel])]:pt-4", diff --git a/apps/web/src/components/ui/command.tsx b/apps/web/src/components/ui/command.tsx index bc95d2c6f25d040f4f3d33d4ae6cc14495f44d86..700dd483f1f0b487a450faad97c9a613321733bd 100644 --- a/apps/web/src/components/ui/command.tsx +++ b/apps/web/src/components/ui/command.tsx @@ -23,18 +23,10 @@ const CommandDialogPortal = CommandDialogPrimitive.Portal; const CommandCreateHandle = CommandDialogPrimitive.createHandle; function CommandDialogTrigger(props: CommandDialogPrimitive.Trigger.Props) { - return ( - - ); + return ; } -function CommandDialogBackdrop({ - className, - ...props -}: CommandDialogPrimitive.Backdrop.Props) { +function CommandDialogBackdrop({ className, ...props }: CommandDialogPrimitive.Backdrop.Props) { return ( @@ -125,10 +110,7 @@ function CommandInput({ ); } -function CommandList({ - className, - ...props -}: React.ComponentProps) { +function CommandList({ className, ...props }: React.ComponentProps) { return ( ) { +function CommandEmpty({ className, ...props }: React.ComponentProps) { return ( ) { ); } -function CommandGroup({ - className, - ...props -}: React.ComponentProps) { - return ( - - ); +function CommandGroup({ className, ...props }: React.ComponentProps) { + return ; } function CommandGroupLabel({ @@ -178,30 +148,17 @@ function CommandGroupLabel({ ...props }: React.ComponentProps) { return ( - + ); } -function CommandCollection({ - ...props -}: React.ComponentProps) { +function CommandCollection({ ...props }: React.ComponentProps) { return ; } -function CommandItem({ - className, - ...props -}: React.ComponentProps) { +function CommandItem({ className, ...props }: React.ComponentProps) { return ( - + ); } diff --git a/apps/web/src/components/ui/dialog.tsx b/apps/web/src/components/ui/dialog.tsx index d75c4bea0182d8d40d79a5fc5ab7d73623a0161a..080ac809975621bbca1de31d7b9e5a4078a064b9 100644 --- a/apps/web/src/components/ui/dialog.tsx +++ b/apps/web/src/components/ui/dialog.tsx @@ -20,10 +20,7 @@ function DialogClose(props: DialogPrimitive.Close.Props) { return ; } -function DialogBackdrop({ - className, - ...props -}: DialogPrimitive.Backdrop.Props) { +function DialogBackdrop({ className, ...props }: DialogPrimitive.Backdrop.Props) { return ( ); } -function DialogDescription({ - className, - ...props -}: DialogPrimitive.Description.Props) { +function DialogDescription({ className, ...props }: DialogPrimitive.Description.Props) { return ( ) { function EmptyHeader({ className, ...props }: React.ComponentProps<"div">) { return (
@@ -73,10 +70,7 @@ function EmptyMedia({ /> )} -
+
); } @@ -117,11 +111,4 @@ function EmptyContent({ className, ...props }: React.ComponentProps<"div">) { ); } -export { - Empty, - EmptyHeader, - EmptyTitle, - EmptyDescription, - EmptyContent, - EmptyMedia, -}; +export { Empty, EmptyHeader, EmptyTitle, EmptyDescription, EmptyContent, EmptyMedia }; diff --git a/apps/web/src/components/ui/field.tsx b/apps/web/src/components/ui/field.tsx index 47ad20052f97e63af1cd90b42de26f3091157b96..1bf65b6c8049dbb4bb3736860971441aa81f09c6 100644 --- a/apps/web/src/components/ui/field.tsx +++ b/apps/web/src/components/ui/field.tsx @@ -29,18 +29,11 @@ function FieldLabel({ className, ...props }: FieldPrimitive.Label.Props) { function FieldItem({ className, ...props }: FieldPrimitive.Item.Props) { return ( - + ); } -function FieldDescription({ - className, - ...props -}: FieldPrimitive.Description.Props) { +function FieldDescription({ className, ...props }: FieldPrimitive.Description.Props) { return ( ); } -function FieldsetLegend({ - className, - ...props -}: FieldsetPrimitive.Legend.Props) { +function FieldsetLegend({ className, ...props }: FieldsetPrimitive.Legend.Props) { return ( ("input, textarea"); + const input = parent?.querySelector( + "input, textarea", + ); if (input && !parent?.querySelector("input:focus, textarea:focus")) { input.focus(); } @@ -92,10 +92,4 @@ function InputGroupTextarea({ className, ...props }: TextareaProps) { return