diff --git a/packages/session-query/session-log-export/tests/client-apply.client.spec.tsx b/packages/session-query/session-log-export/tests/client-apply.client.spec.tsx index d481acf6bd..0613c9c9c2 100644 --- a/packages/session-query/session-log-export/tests/client-apply.client.spec.tsx +++ b/packages/session-query/session-log-export/tests/client-apply.client.spec.tsx @@ -28,6 +28,11 @@ function declare(slots: SlotRegistry): () => void { } as never, () => null) } +function injectedOf(entry: { inject?: ((...args: never[]) => object) | undefined } | undefined): object { + if (entry?.inject === undefined) throw new Error('slot entry has no injection') + return entry.inject() +} + async function bench() { const ctx = new Context() await ctx.plugin(SlotRegistry).await() @@ -43,7 +48,7 @@ describe('session-log-download browser plugin', () => { it('follows feedback plugin availability and opens the selected Session form', async () => { const b = await bench() const entry = b.slots.entries('conversation.session.header.utilities')[0]! - const injected = (entry.inject as unknown as () => SessionLogDownloadHeaderInjected)() + const injected = injectedOf(entry) as SessionLogDownloadHeaderInjected expect(injected.hooks.feedbackAvailable.getSnapshot()).toBe(false) injected.openFeedback(SID) @@ -69,7 +74,7 @@ describe('session-log-download browser plugin', () => { const entry = b.slots.entries('conversation.session.header.utilities')[0] expect(entry?.component).toBe(SessionLogDownloadHeaderAction) expect(entry?.options).toMatchObject({ id: 'session-log-download' }) - const injected = (entry?.inject as unknown as () => SessionLogDownloadHeaderInjected)() + const injected = injectedOf(entry) as SessionLogDownloadHeaderInjected await injected.request(SID) expect(b.ctx.sessionLogDownload.store.getSnapshot().bySession[SID]?.status).toBe('error') injected.dismiss(SID) @@ -78,7 +83,7 @@ describe('session-log-download browser plugin', () => { const overlay = b.slots.entries('shell.overlay')[0] expect(overlay?.component).toBe(SessionMarkdownCopyToast) expect(overlay?.options).toMatchObject({ id: 'session-log-download.copy-toast' }) - const overlayInjected = (overlay?.inject as unknown as () => SessionMarkdownCopyToastInjected)() + const overlayInjected = injectedOf(overlay) as SessionMarkdownCopyToastInjected await injected.copyMarkdown(SID) expect(injected.hooks.sessionMarkdownCopy.getSnapshot().notice?.kind).toBe('failed') overlayInjected.dismiss() diff --git a/packages/session-query/session-log-export/tests/copy-toast.client.spec.tsx b/packages/session-query/session-log-export/tests/copy-toast.client.spec.tsx index f03b5e7702..52a34b1a97 100644 --- a/packages/session-query/session-log-export/tests/copy-toast.client.spec.tsx +++ b/packages/session-query/session-log-export/tests/copy-toast.client.spec.tsx @@ -20,11 +20,12 @@ function bindSnapshot(store: ObservableSnapshot) { function bench(notice: SessionMarkdownCopyState['notice']) { const store = createSnapshotStore({ copying: false, notice }) const dismiss = vi.fn() - const props = { + const dictionary: Record = en + const props: SessionMarkdownCopyToastProps = { useSessionMarkdownCopy: bindSnapshot(store), dismiss, - t: (key: keyof typeof en): string => en[key], - } as unknown as SessionMarkdownCopyToastProps + t: key => dictionary[key] ?? key, + } return { ...render(), store, dismiss } } diff --git a/packages/session-query/session-log-export/tests/header-action.client.spec.tsx b/packages/session-query/session-log-export/tests/header-action.client.spec.tsx index e3d6499439..91400e6680 100644 --- a/packages/session-query/session-log-export/tests/header-action.client.spec.tsx +++ b/packages/session-query/session-log-export/tests/header-action.client.spec.tsx @@ -3,6 +3,7 @@ import { act, cleanup, fireEvent, render, waitFor } from '@testing-library/react import { afterEach, describe, expect, it, vi } from 'vitest' import { useSyncExternalStore } from 'react' import type { SessionId } from '@deepseek-ai/dsh-session/types' +import type { GlobalStandardProps, SessionStandardProps } from '@deepseek-ai/dsh-client-ui-slots' import { createSnapshotStore, type ObservableSnapshot } from '@deepseek-ai/dsh-client-store' import { SessionLogDownloadController } from '../src/client/controller.ts' import { SessionMarkdownCopyController } from '../src/client/copy-controller.ts' @@ -11,6 +12,18 @@ import type { SessionLogDownloadHeaderProps } from '../src/client/HeaderAction.t import { en } from '../src/client/locales.ts' const SID = 'session-export-header' as SessionId +const dictionary: Record = en +const translate: SessionLogDownloadHeaderProps['t'] = key => dictionary[key] ?? key +const unused = (): never => { throw new Error('This isolated component does not consume framework hooks') } +const standard: GlobalStandardProps & SessionStandardProps = { + sessionId: SID, useSession: unused, useProjection: unused, useAccess: () => true, + useSessions: unused, useSessionStatus: unused, useSessionRetainInfo: unused, + useSessionAccess: () => true, useRemoteAccess: () => true, useWorkspaceAccess: () => true, + useConversation: unused, useInput: unused, useChat: unused, useTrajectory: unused, + usePanelInfo: unused, useResource: unused, useWorkspaces: unused, + inputActions: { captureInsertion: unused, insertText: unused, setDraft: unused, persistDraft: unused, + addAttachments: unused, removeAttachment: unused, pruneAttachments: unused, submit: unused }, +} function bindSnapshot(store: ObservableSnapshot) { return function useSnapshot(selector: (state: State) => T): T { @@ -33,8 +46,8 @@ function bench(feedbackAvailable = false, copyController = new SessionMarkdownCo const feedback = createSnapshotStore(feedbackAvailable) const useSessionLogDownload = bindSnapshot(controller.store) const useSessionMarkdownCopy = bindSnapshot(copyController.store) - const props = { - sessionId: SID, + const props: SessionLogDownloadHeaderProps = { + ...standard, useSessionLogDownload, useSessionMarkdownCopy, useFeedbackAvailable: bindSnapshot(feedback), @@ -42,8 +55,8 @@ function bench(feedbackAvailable = false, copyController = new SessionMarkdownCo request, copyMarkdown, dismiss, - t: (key: keyof typeof en): string => en[key], - } as unknown as SessionLogDownloadHeaderProps + t: translate, + } const view = render() return { controller, copyController, request, copyMarkdown, openFeedback, feedback, view } } @@ -150,8 +163,8 @@ describe('Session export Header action', () => { const pending = new Promise((resolve) => { release = resolve }) const controller = new SessionLogDownloadController(() => pending, vi.fn()) const useSessionLogDownload = bindSnapshot(controller.store) - b.view.rerender( { request: (sessionId: SessionId) => controller.download(sessionId), copyMarkdown: b.copyMarkdown, dismiss: (sessionId: SessionId) => { controller.dismiss(sessionId) }, - t: (key: keyof typeof en): string => en[key], - } as unknown as SessionLogDownloadHeaderProps)} />) + t: translate, + } + b.view.rerender() const download = controller.download(SID) const button = b.view.getByRole('button', { name: 'More actions' }) diff --git a/scripts/no-unknown-casts.baseline.json b/scripts/no-unknown-casts.baseline.json index 41520f4e27..9070545648 100644 --- a/scripts/no-unknown-casts.baseline.json +++ b/scripts/no-unknown-casts.baseline.json @@ -1530,10 +1530,6 @@ "cb524acd0159b942e7974d76b581b1f419b8653d1734946a3f154dda8e8f4762": 1, "f10c6a0a3a762be54c2de87ab5d787e37a21a89c9d468bf81d0658c2bf15d581": 1 }, - "packages/session-query/session-log-export/tests/client-apply.client.spec.tsx": { - "04984a2ce1486250236e638e0197da0a1a840855ed3975c59130a85358c7e5fe": 1, - "eee35b4d8641824c6eaacfe03ed60d353d81d5257d1111132f34d46a7b13ef35": 1 - }, "packages/session-query/session-log-export/tests/controller.client.spec.ts": { "746ebc5aade01a50cc9a74fc07b1023addf021aef80b62c069a437ac140c9e64": 1, "c920d88f6eb309ef5991608642a1ab0fd972690538b33c34d86c68d07ddd6edf": 1 @@ -1541,10 +1537,6 @@ "packages/session-query/session-log-export/tests/dialog.client.spec.tsx": { "a9b1969d76db0b05f87c862956f8ff45c52f1f4a5b32a206339de0c9fee99a77": 1 }, - "packages/session-query/session-log-export/tests/header-action.client.spec.tsx": { - "238a292bbe3a61acbc4f2d96fff474df5fba1577357219a88c914813786b56a7": 1, - "47d3a14a42ef7142ea22071677b42265f02fba5a2a0cf4210f4f9c7c5a876d10": 1 - }, "packages/session-query/session-log-export/tests/loader-composition.host.spec.ts": { "59c63f734e8bba862325f776e3fcbebd78a84cfb4161f8df41c216950d9bf351": 1, "e12d49327a6708ae3ace371e28ed0deb471dc8895c584ba94a86af344c15cec3": 1