import { describe, it, expect } from 'vitest' import type { Handle, RemixNode } from '@remix-run/component' import { dom } from '@remix-run/events' import { render } from '../render.ts' import { flushRenderQueue as flush } from '../reconcile.ts' import { createManagedRegionElement } from '../frame/managed-region.ts' describe('managed regions', () => { it('skips diffing inside region when parent rerenders', () => { let container = document.createElement('div') let count = 0 function RegionOwner(this: Handle) { return () => { return (
{createManagedRegionElement('test')}
) } } // Seed DOM content inside the region boundaries manually to simulate runtime-owned DOM render(, container) // Find boundaries and insert static content between them let start = findBoundary(container, 'test', 'start')! let end = findBoundary(container, 'test', 'end')! let staticSpan = document.createElement('span') staticSpan.setAttribute('data-region', 'true') staticSpan.textContent = 'STATIC' start.parentNode!.insertBefore(staticSpan, end) // Click to trigger parent rerender let button = container.querySelector('[data-testid="inc"]') as HTMLButtonElement button.click() flush() // Assert region content was preserved expect(container.querySelector('[data-region="true"]')?.textContent).toBe('STATIC') }) }) function findBoundary(container: HTMLElement, id: string, suffix: 'start' | 'end'): Comment | null { let walker = document.createTreeWalker(container, NodeFilter.SHOW_COMMENT) let node: Comment | null let target = `RMX:${id}:${suffix}` while ((node = walker.nextNode() as Comment | null)) { if (node && node.nodeType === 8 && node.data === target) return node } return null }