From bd2900483150d690acdc53acb37e98eda7bb7fe5 Mon Sep 17 00:00:00 2001 From: Kit Langton Date: Wed, 15 Apr 2026 23:50:50 -0400 Subject: [PATCH] feat: enable type-aware no-misused-spread rule, fix 8 violations (#22749) --- .opencode/tool/github-pr-search.ts | 2 +- .opencode/tool/github-triage.ts | 2 +- .oxlintrc.json | 9 +++++++-- packages/app/src/utils/server.ts | 5 ++++- .../app/src/routes/download/[channel]/[platform].ts | 2 +- packages/opencode/src/cli/cmd/tui/component/logo.tsx | 2 +- packages/opencode/src/server/ui/index.ts | 4 ++-- packages/opencode/src/v2/session-event.ts | 6 +++++- 8 files changed, 22 insertions(+), 10 deletions(-) diff --git a/.opencode/tool/github-pr-search.ts b/.opencode/tool/github-pr-search.ts index 927e68fd73..8bc8c554aa 100644 --- a/.opencode/tool/github-pr-search.ts +++ b/.opencode/tool/github-pr-search.ts @@ -7,7 +7,7 @@ async function githubFetch(endpoint: string, options: RequestInit = {}) { Authorization: `Bearer ${process.env.GITHUB_TOKEN}`, Accept: "application/vnd.github+json", "Content-Type": "application/json", - ...options.headers, + ...(options.headers instanceof Headers ? Object.fromEntries(options.headers.entries()) : options.headers), }, }) if (!response.ok) { diff --git a/.opencode/tool/github-triage.ts b/.opencode/tool/github-triage.ts index c06d2407fe..dcbfc8d054 100644 --- a/.opencode/tool/github-triage.ts +++ b/.opencode/tool/github-triage.ts @@ -28,7 +28,7 @@ async function githubFetch(endpoint: string, options: RequestInit = {}) { Authorization: `Bearer ${process.env.GITHUB_TOKEN}`, Accept: "application/vnd.github+json", "Content-Type": "application/json", - ...options.headers, + ...(options.headers instanceof Headers ? Object.fromEntries(options.headers.entries()) : options.headers), }, }) if (!response.ok) { diff --git a/.oxlintrc.json b/.oxlintrc.json index a0b620649f..f1ca1ff46f 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -37,10 +37,15 @@ "no-new": "off", // Type-aware: catch unhandled promises - "typescript/no-floating-promises": "warn" + "typescript/no-floating-promises": "warn", + // Warn when spreading non-plain objects (Headers, class instances, etc.) + "typescript/no-misused-spread": "warn" }, "options": { "typeAware": true }, - "ignorePatterns": ["**/node_modules", "**/dist", "**/.build", "**/.sst", "**/*.d.ts"] + "options": { + "typeAware": true + }, + "ignorePatterns": ["**/node_modules", "**/dist", "**/.build", "**/.sst", "**/*.d.ts", "**/sdk.gen.ts"] } diff --git a/packages/app/src/utils/server.ts b/packages/app/src/utils/server.ts index 17f4a3adce..ae849b71ee 100644 --- a/packages/app/src/utils/server.ts +++ b/packages/app/src/utils/server.ts @@ -16,7 +16,10 @@ export function createSdkForServer({ return createOpencodeClient({ ...config, - headers: { ...config.headers, ...auth }, + headers: { + ...(config.headers instanceof Headers ? Object.fromEntries(config.headers.entries()) : config.headers), + ...auth, + }, baseUrl: server.url, }) } diff --git a/packages/console/app/src/routes/download/[channel]/[platform].ts b/packages/console/app/src/routes/download/[channel]/[platform].ts index e9b3f23e79..82d2f1d01c 100644 --- a/packages/console/app/src/routes/download/[channel]/[platform].ts +++ b/packages/console/app/src/routes/download/[channel]/[platform].ts @@ -37,5 +37,5 @@ export async function GET({ params: { platform, channel } }: APIEvent) { const headers = new Headers(resp.headers) if (downloadName) headers.set("content-disposition", `attachment; filename="${downloadName}"`) - return new Response(resp.body, { ...resp, headers }) + return new Response(resp.body, { status: resp.status, statusText: resp.statusText, headers }) } diff --git a/packages/opencode/src/cli/cmd/tui/component/logo.tsx b/packages/opencode/src/cli/cmd/tui/component/logo.tsx index 51cf69dc1f..d41d36a6e1 100644 --- a/packages/opencode/src/cli/cmd/tui/component/logo.tsx +++ b/packages/opencode/src/cli/cmd/tui/component/logo.tsx @@ -520,7 +520,7 @@ export function Logo() { const shadow = tint(theme.background, ink, 0.25) const attrs = bold ? TextAttributes.BOLD : undefined - return [...line].map((char, i) => { + return Array.from(line).map((char, i) => { const h = field(off + i, y, frame) const n = wave(off + i, y, frame, lit(char)) + h const s = wave(off + i, y, dusk, false) + h diff --git a/packages/opencode/src/server/ui/index.ts b/packages/opencode/src/server/ui/index.ts index afe6e510f1..d449cd1c42 100644 --- a/packages/opencode/src/server/ui/index.ts +++ b/packages/opencode/src/server/ui/index.ts @@ -37,9 +37,9 @@ export const UIRoutes = (): Hono => } } else { const response = await proxy(`https://app.opencode.ai${path}`, { - ...c.req, + raw: c.req.raw, headers: { - ...c.req.raw.headers, + ...Object.fromEntries(c.req.raw.headers.entries()), host: "app.opencode.ai", }, }) diff --git a/packages/opencode/src/v2/session-event.ts b/packages/opencode/src/v2/session-event.ts index f662f05e71..8ea239033f 100644 --- a/packages/opencode/src/v2/session-event.ts +++ b/packages/opencode/src/v2/session-event.ts @@ -39,7 +39,11 @@ export namespace SessionEvent { }) { static create(input: FileAttachment) { return new FileAttachment({ - ...input, + uri: input.uri, + mime: input.mime, + name: input.name, + description: input.description, + source: input.source, }) } }