Plan 2 of the web embedding SDK: a self-contained, framework-agnostic TypeScript core wrapping the Plan-1 wasm Viewer. createViewer -> OpViewer with load, read-only snapshots (document/pages/pageCount/activePage), pan/zoom navigation (+ wheel), SVG export, load/viewportchange events, and destroy. Read-only: no .op editing/mutation. Self-contained: zero @zseven-w/pen-* deps (types vendored from jian-ops-schema ts-rs), tsup build, vitest+jsdom tests that mock the wasm seam. 10/10 tests; tsc clean; post-destroy use-after-free guarded. React+Vue adapters follow in Plan 3.
20 lines
693 B
TypeScript
20 lines
693 B
TypeScript
import { describe, it, expect, vi } from 'vitest';
|
|
|
|
// Mock the virtual wasm module (resolved to test/wasm-stub.ts by vitest.config.ts).
|
|
// vi.mock hoists before imports, so the spy is in place when ensureWasm loads.
|
|
vi.mock('virtual:op_web_sdk_wasm', () => {
|
|
const init = vi.fn(async () => ({}));
|
|
return { default: init, Viewer: class {}, _export: vi.fn(() => new Uint8Array()) };
|
|
});
|
|
|
|
import { ensureWasm } from '../src/wasm.js';
|
|
import initGlue from 'virtual:op_web_sdk_wasm';
|
|
|
|
describe('ensureWasm', () => {
|
|
it('calls the wasm init exactly once across two calls', async () => {
|
|
await ensureWasm();
|
|
await ensureWasm();
|
|
expect(initGlue).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|