import * as glassEasel from 'glass-easel' import { type ShadowSyncElement } from '../../src/backend' import { bridgeOnData, bridgeOnView, createViewContext, domBackend, shadowSyncBackend, tmpl, viewComponentSpace, } from '../base/env' const componentSpace = new glassEasel.ComponentSpace() componentSpace.updateComponentOptions({ writeFieldsToNode: true, writeIdToDOM: true, }) const replayedDomHtml = (elem: glassEasel.Element): string => { bridgeOnData.disconnect() bridgeOnView.disconnect() const rootNode = document.createElement('div') const newViewContext = createViewContext( rootNode as unknown as glassEasel.domlikeBackend.Element, domBackend, viewComponentSpace, ) bridgeOnData.connect(newViewContext.bridgeOnView) shadowSyncBackend.replay( glassEasel, [elem], (elem) => elem.getBackendElement() as ShadowSyncElement, ) const innerHTML = (rootNode.firstChild! as Element).innerHTML bridgeOnData.connect(bridgeOnView) return innerHTML } describe('replay', () => { test('basic replay', () => { const child = componentSpace.defineComponent({ properties: { text: String, }, template: tmpl(` {{text}} `), }) const rootDef = componentSpace.defineComponent({ using: { child }, template: tmpl(` !{{text}}! `), data: { text: '', }, }) const elem = glassEasel.Component.createWithContext('root', rootDef, shadowSyncBackend) elem.destroyBackendElementOnDetach() expect(replayedDomHtml(elem)).toEqual('') elem.setData({ text: '123', }) expect(replayedDomHtml(elem)).toEqual( '123!123!', ) elem.setData({ text: '233', }) expect(replayedDomHtml(elem)).toEqual( '233!233!', ) elem.setData({ text: '', }) expect(replayedDomHtml(elem)).toEqual('') }) })