openpencil/packages/op-web-sdk-react/test/mock-core.ts
Kayshen-X 199d9bbec9 feat(sdk): add React + Vue adapters for op-web-sdk
Plan 3 of the web embedding SDK: @zseven-w/op-web-sdk-react and -vue — thin
read-only framework adapters over the TS core. Each: <DesignView> (canvas +
viewer lifecycle), provider/inject of OpViewer, and read-only
useDocument/useViewport/useActivePage. React via useSyncExternalStore
(cache-invalidate-on-event); Vue via an async shallowRef provider so children
inject the viewer after load. Self-contained (no pen-* deps; framework peer);
React 5/5 + Vue 4/4 tests; both tsc clean.
2026-06-19 21:01:27 +08:00

25 lines
1.2 KiB
TypeScript

import { vi } from 'vitest';
// A controllable fake OpViewer for adapter tests. `emit(event)` fires listeners.
export function makeMockViewer() {
const listeners: Record<string, Set<() => void>> = { load: new Set(), viewportchange: new Set() };
let vp = { panX: 0, panY: 0, zoom: 1 };
const viewer = {
load: vi.fn(),
get document() { return { id: 'doc', pages: [] }; },
get pages() { return [{ id: 'p', name: 'P', children: [] }]; },
get pageCount() { return 1; },
get activePage() { return 0; },
get viewport() { return vp; },
setViewport: vi.fn((v: { panX: number; panY: number; zoom: number }) => { vp = v; }),
setZoom: vi.fn((z: number) => { vp = { ...vp, zoom: z }; }),
panTo: vi.fn(), zoomToFit: vi.fn(),
export: vi.fn(() => new Uint8Array([60, 115, 118, 103, 47, 62])),
on: vi.fn((e: string, cb: () => void) => { listeners[e].add(cb); return () => listeners[e].delete(cb); }),
off: vi.fn((e: string, cb: () => void) => { listeners[e].delete(cb); }),
destroy: vi.fn(),
};
const emit = (e: 'load' | 'viewportchange') => listeners[e].forEach((cb) => cb());
return { viewer, emit };
}
// Shared vi.mock factory: tests call vi.mock('@zseven-w/op-web-sdk', () => coreMock(current))