import { useState } from '@lynx-js/react'; import { options } from 'preact'; import { root } from '../../../../../src/element-template/index.js'; import { registerTemplates } from '../../../test-utils/debug/registry.js'; import { runElementTemplateUpdate } from '../../../test-utils/debug/updateRunner.js'; export async function run() { // Capture scheduled renders so we can flush them while still on background thread. const scheduledRenders: Array<() => void> = []; const previousDebounce = options.debounceRendering; options.debounceRendering = (cb) => { scheduledRenders.push(cb); }; try { let triggerUpdate: (() => void) | undefined; const EtStateUpdate = '_et_state_update' as unknown as JSX.ElementType; registerTemplates([ { templateId: '_et_state_update', compiledTemplate: { kind: 'element', type: 'view', attributesArray: [ { kind: 'slot', key: 'id', attrSlotIndex: 0 }, ], children: [], }, }, ]); function App() { const [label, setLabel] = useState('before'); if (__BACKGROUND__) { triggerUpdate = () => setLabel('after'); } return ; } const result = runElementTemplateUpdate({ render: () => , update: () => { triggerUpdate!(); while (scheduledRenders.length > 0) { const flush = scheduledRenders.shift(); flush?.(); } }, }); return { files: { 'before-jsx.txt': result.beforePageJsx, 'after-jsx.txt': result.afterPageJsx, 'ops.txt': result.formattedOps, }, }; } finally { options.debounceRendering = previousDebounce; } }