/** * 单测环境补丁 —— happy-dom 缺少组件依赖的若干浏览器 API。 * * happy-dom 没有真实布局引擎,所以: * - 依赖实测尺寸的逻辑(浮层定位、Splitter 拖拽)拿不到有效值,那类行为放到 E2E(Playwright)里验; * - 这里只补「不补就会抛错」的 API,让组件能正常挂载与交互。 */ class ResizeObserverStub { observe(): void {} unobserve(): void {} disconnect(): void {} } if (!('ResizeObserver' in globalThis)) { ;(globalThis as unknown as Record).ResizeObserver = ResizeObserverStub } if (typeof window !== 'undefined') { if (!window.matchMedia) { window.matchMedia = ((query: string) => ({ matches: false, media: query, onchange: null, addListener: () => {}, removeListener: () => {}, addEventListener: () => {}, removeEventListener: () => {}, dispatchEvent: () => false, })) as unknown as typeof window.matchMedia } if (!Element.prototype.scrollIntoView) { Element.prototype.scrollIntoView = () => {} } // happy-dom 未实现 PointerEvent 时用 MouseEvent 兜底,保证指针交互的监听能注册 if (!('PointerEvent' in window)) { ;(window as unknown as Record).PointerEvent = MouseEvent } }