From 045dc06a1f5a2d551233edb1e5a60fcd85b99a6e Mon Sep 17 00:00:00 2001 From: openhands Date: Mon, 13 Jul 2026 22:10:50 +0200 Subject: [PATCH] fix: resolve type errors and migrate pnpm settings to pnpm-workspace.yaml - Move pnpm.onlyBuiltDependencies/overrides from package.json to pnpm-workspace.yaml (clears pnpm WARN) - Allow useServerAction run() to accept actions returning void - Make adminAction/authAction input optional so no-schema actions can be called without args - Return ActionResult from updateBcPage - Fix categoryPageMap value type (number | undefined) - Declare DbService.queryCount field - Use definite assignment for release in withFurniDataLock - Narrow pair type in theme-contrast test --- package.json | 16 ---------------- pnpm-workspace.yaml | 13 +++++++++++++ src/actions/catalog-bc.ts | 1 + src/app/api/admin/import/furni/route.ts | 2 +- src/hooks/use-server-action.ts | 2 +- src/lib/foundation/action.ts | 4 ++-- src/lib/foundation/database.ts | 1 + src/lib/services/furni-data.ts | 2 +- src/lib/theme-contrast.test.ts | 16 ++++++++-------- 9 files changed, 28 insertions(+), 29 deletions(-) create mode 100644 pnpm-workspace.yaml diff --git a/package.json b/package.json index 9eb81a3d45..c334af7bf0 100644 --- a/package.json +++ b/package.json @@ -76,21 +76,5 @@ "tsx": "^4.22.5", "typescript": "^5.7.0", "vitest": "^2.1.0" - }, - "pnpm": { - "onlyBuiltDependencies": [ - "esbuild", - "prisma", - "@prisma/client", - "@prisma/engines", - "sharp", - "@parcel/watcher", - "@swc/core" - ], - "overrides": { - "fast-uri": "^3.1.3", - "@hono/node-server": "^1.19.13", - "postcss": "^8.5.16" - } } } diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000..47709699dd --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,13 @@ +onlyBuiltDependencies: + - esbuild + - prisma + - "@prisma/client" + - "@prisma/engines" + - sharp + - "@parcel/watcher" + - "@swc/core" + +overrides: + fast-uri: "^3.1.3" + "@hono/node-server": "^1.19.13" + postcss: "^8.5.16" diff --git a/src/actions/catalog-bc.ts b/src/actions/catalog-bc.ts index 18026f810b..719280acba 100644 --- a/src/actions/catalog-bc.ts +++ b/src/actions/catalog-bc.ts @@ -21,6 +21,7 @@ export async function updateBcPage({ targetId: id, }); revalidatePath("/admin/catalog/builder-club"); + return { ok: true as const }; } export async function deleteBcItem({ id }: { id: number }) { diff --git a/src/app/api/admin/import/furni/route.ts b/src/app/api/admin/import/furni/route.ts index 4a812e37b4..01ca885abf 100644 --- a/src/app/api/admin/import/furni/route.ts +++ b/src/app/api/admin/import/furni/route.ts @@ -625,7 +625,7 @@ export const PUT = withAdmin( } // 5. Pre-load category page map (captionSave → pageId) to avoid N+1 queries - const categoryPageMap = new Map(); + const categoryPageMap = new Map(); for (const sp of subPages) { if (sp.captionSave) categoryPageMap.set(sp.captionSave, sp.id); } diff --git a/src/hooks/use-server-action.ts b/src/hooks/use-server-action.ts index ba43b848c7..79f787eace 100644 --- a/src/hooks/use-server-action.ts +++ b/src/hooks/use-server-action.ts @@ -37,7 +37,7 @@ export function useServerAction(options: UseServerActionOptions = {}) { const router = useRouter(); function run( - action: () => Promise, + action: () => Promise, opts: RunOptions = {}, ) { const { diff --git a/src/lib/foundation/action.ts b/src/lib/foundation/action.ts index 4bf23a2ee4..525956d00a 100644 --- a/src/lib/foundation/action.ts +++ b/src/lib/foundation/action.ts @@ -61,7 +61,7 @@ export function adminAction( handler: ActionHandler, ) { return async ( - input: TSchema extends z.ZodType ? z.input : undefined, + input?: TSchema extends z.ZodType ? z.input : undefined, ): Promise => { const ip = await extractClientIpAsync(); const store = createStore(ip); @@ -158,7 +158,7 @@ export function authAction( ) => Promise, ) { return async ( - input: TSchema extends z.ZodType ? z.input : undefined, + input?: TSchema extends z.ZodType ? z.input : undefined, ): Promise => { const ip = await extractClientIpAsync(); const store = createStore(ip); diff --git a/src/lib/foundation/database.ts b/src/lib/foundation/database.ts index a47276b550..dc2ca37388 100644 --- a/src/lib/foundation/database.ts +++ b/src/lib/foundation/database.ts @@ -19,6 +19,7 @@ export class DbService { private readonly client: PrismaClient; private lastHealthCheck = 0; private healthCache: HealthStatus | null = null; + private queryCount = 0; private readonly healthTtlMs = 10_000; constructor() { diff --git a/src/lib/services/furni-data.ts b/src/lib/services/furni-data.ts index f2ce02c47c..0fe555179d 100644 --- a/src/lib/services/furni-data.ts +++ b/src/lib/services/furni-data.ts @@ -88,7 +88,7 @@ async function acquireDiskLock(lockPath: string): Promise { } export async function withFurniDataLock(fn: () => Promise): Promise { - let release: () => void; + let release!: () => void; const acquired = new Promise((r) => { release = r; }); diff --git a/src/lib/theme-contrast.test.ts b/src/lib/theme-contrast.test.ts index 16462eddd8..01ed879123 100644 --- a/src/lib/theme-contrast.test.ts +++ b/src/lib/theme-contrast.test.ts @@ -166,14 +166,14 @@ describe("derivePublicForegrounds", () => { for (const palette of [preset.light, preset.dark]) { const result = derivePublicForegrounds(palette); for (const name of required) { - const pair = result.pairs.find( - (candidate) => candidate.name === name, - ); - expect(pair, `missing ${name}`).toBeDefined(); - expect( - contrastRatio(pair?.foreground, pair?.background), - name, - ).toBeGreaterThanOrEqual(4.5); + const pair = result.pairs.find( + (candidate) => candidate.name === name, + ); + expect(pair, `missing ${name}`).toBeDefined(); + expect( + contrastRatio(pair!.foreground, pair!.background), + name, + ).toBeGreaterThanOrEqual(4.5); } } }