@thoughtspot/visual-embed-sdk 1.50.0 → 1.51.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +95 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +136 -15
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +59 -37
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +419 -149
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/conversation.d.ts +230 -1
  11. package/cjs/src/embed/conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/conversation.js +30 -16
  13. package/cjs/src/embed/conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.spec.js +221 -17
  15. package/cjs/src/embed/conversation.spec.js.map +1 -1
  16. package/cjs/src/embed/events.spec.js +635 -0
  17. package/cjs/src/embed/events.spec.js.map +1 -1
  18. package/cjs/src/embed/host-events.spec.js +151 -0
  19. package/cjs/src/embed/host-events.spec.js.map +1 -1
  20. package/cjs/src/embed/hostEventClient/contracts.d.ts +51 -14
  21. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  22. package/cjs/src/embed/hostEventClient/contracts.js +11 -1
  23. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  24. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  25. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  26. package/cjs/src/embed/hostEventClient/host-event-client.js +9 -0
  27. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  28. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +218 -0
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/utils.d.ts +2 -0
  31. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/utils.js +32 -2
  33. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/utils.spec.js +178 -0
  35. package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
  36. package/cjs/src/embed/liveboard.d.ts +42 -1
  37. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  38. package/cjs/src/embed/liveboard.js +26 -6
  39. package/cjs/src/embed/liveboard.js.map +1 -1
  40. package/cjs/src/embed/liveboard.spec.js +83 -2
  41. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  42. package/cjs/src/embed/spotter-utils.d.ts +8 -1
  43. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  44. package/cjs/src/embed/spotter-utils.js +14 -1
  45. package/cjs/src/embed/spotter-utils.js.map +1 -1
  46. package/cjs/src/embed/spotter-utils.spec.js +61 -0
  47. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  48. package/cjs/src/embed/spotter-viz-utils.d.ts +34 -0
  49. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  50. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  51. package/cjs/src/embed/spotter-viz-utils.spec.js +17 -0
  52. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -1
  53. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  54. package/cjs/src/embed/ts-embed.js +29 -7
  55. package/cjs/src/embed/ts-embed.js.map +1 -1
  56. package/cjs/src/embed/ts-embed.spec.js +146 -0
  57. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  58. package/cjs/src/errors.d.ts +1 -0
  59. package/cjs/src/errors.d.ts.map +1 -1
  60. package/cjs/src/errors.js +1 -0
  61. package/cjs/src/errors.js.map +1 -1
  62. package/cjs/src/index.d.ts +2 -2
  63. package/cjs/src/index.d.ts.map +1 -1
  64. package/cjs/src/index.js +3 -2
  65. package/cjs/src/index.js.map +1 -1
  66. package/cjs/src/mixpanel-service.d.ts +4 -0
  67. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  68. package/cjs/src/mixpanel-service.js +4 -0
  69. package/cjs/src/mixpanel-service.js.map +1 -1
  70. package/cjs/src/react/util.spec.js +251 -0
  71. package/cjs/src/react/util.spec.js.map +1 -1
  72. package/cjs/src/types.d.ts +573 -11
  73. package/cjs/src/types.d.ts.map +1 -1
  74. package/cjs/src/types.js +519 -2
  75. package/cjs/src/types.js.map +1 -1
  76. package/cjs/src/utils/processData.spec.js +93 -0
  77. package/cjs/src/utils/processData.spec.js.map +1 -1
  78. package/cjs/src/utils/processTrigger.spec.js +61 -0
  79. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  80. package/dist/{index-B5xoN6Cp.js → index-aBzH5ZwF.js} +1 -1
  81. package/dist/src/css-variables.d.ts +95 -0
  82. package/dist/src/css-variables.d.ts.map +1 -1
  83. package/dist/src/embed/app.d.ts +136 -15
  84. package/dist/src/embed/app.d.ts.map +1 -1
  85. package/dist/src/embed/conversation.d.ts +230 -1
  86. package/dist/src/embed/conversation.d.ts.map +1 -1
  87. package/dist/src/embed/hostEventClient/contracts.d.ts +51 -14
  88. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  89. package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  90. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  91. package/dist/src/embed/hostEventClient/utils.d.ts +2 -0
  92. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  93. package/dist/src/embed/liveboard.d.ts +42 -1
  94. package/dist/src/embed/liveboard.d.ts.map +1 -1
  95. package/dist/src/embed/spotter-utils.d.ts +8 -1
  96. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  97. package/dist/src/embed/spotter-viz-utils.d.ts +34 -0
  98. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  99. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  100. package/dist/src/errors.d.ts +1 -0
  101. package/dist/src/errors.d.ts.map +1 -1
  102. package/dist/src/index.d.ts +2 -2
  103. package/dist/src/index.d.ts.map +1 -1
  104. package/dist/src/mixpanel-service.d.ts +4 -0
  105. package/dist/src/mixpanel-service.d.ts.map +1 -1
  106. package/dist/src/types.d.ts +573 -11
  107. package/dist/src/types.d.ts.map +1 -1
  108. package/dist/tsembed-react.es.js +936 -142
  109. package/dist/tsembed-react.js +935 -141
  110. package/dist/tsembed.es.js +935 -142
  111. package/dist/tsembed.js +933 -140
  112. package/dist/visual-embed-sdk-react-full.d.ts +1147 -44
  113. package/dist/visual-embed-sdk-react.d.ts +1153 -46
  114. package/dist/visual-embed-sdk.d.ts +1161 -46
  115. package/lib/package.json +1 -1
  116. package/lib/src/css-variables.d.ts +95 -0
  117. package/lib/src/css-variables.d.ts.map +1 -1
  118. package/lib/src/embed/app.d.ts +136 -15
  119. package/lib/src/embed/app.d.ts.map +1 -1
  120. package/lib/src/embed/app.js +60 -38
  121. package/lib/src/embed/app.js.map +1 -1
  122. package/lib/src/embed/app.spec.js +420 -150
  123. package/lib/src/embed/app.spec.js.map +1 -1
  124. package/lib/src/embed/conversation.d.ts +230 -1
  125. package/lib/src/embed/conversation.d.ts.map +1 -1
  126. package/lib/src/embed/conversation.js +31 -17
  127. package/lib/src/embed/conversation.js.map +1 -1
  128. package/lib/src/embed/conversation.spec.js +222 -18
  129. package/lib/src/embed/conversation.spec.js.map +1 -1
  130. package/lib/src/embed/events.spec.js +635 -0
  131. package/lib/src/embed/events.spec.js.map +1 -1
  132. package/lib/src/embed/host-events.spec.js +152 -1
  133. package/lib/src/embed/host-events.spec.js.map +1 -1
  134. package/lib/src/embed/hostEventClient/contracts.d.ts +51 -14
  135. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  136. package/lib/src/embed/hostEventClient/contracts.js +10 -0
  137. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  138. package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -0
  139. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  140. package/lib/src/embed/hostEventClient/host-event-client.js +10 -1
  141. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  142. package/lib/src/embed/hostEventClient/host-event-client.spec.js +218 -0
  143. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  144. package/lib/src/embed/hostEventClient/utils.d.ts +2 -0
  145. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  146. package/lib/src/embed/hostEventClient/utils.js +28 -1
  147. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  148. package/lib/src/embed/hostEventClient/utils.spec.js +179 -1
  149. package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
  150. package/lib/src/embed/liveboard.d.ts +42 -1
  151. package/lib/src/embed/liveboard.d.ts.map +1 -1
  152. package/lib/src/embed/liveboard.js +26 -6
  153. package/lib/src/embed/liveboard.js.map +1 -1
  154. package/lib/src/embed/liveboard.spec.js +83 -2
  155. package/lib/src/embed/liveboard.spec.js.map +1 -1
  156. package/lib/src/embed/spotter-utils.d.ts +8 -1
  157. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  158. package/lib/src/embed/spotter-utils.js +12 -0
  159. package/lib/src/embed/spotter-utils.js.map +1 -1
  160. package/lib/src/embed/spotter-utils.spec.js +62 -1
  161. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  162. package/lib/src/embed/spotter-viz-utils.d.ts +34 -0
  163. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  164. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  165. package/lib/src/embed/spotter-viz-utils.spec.js +17 -0
  166. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -1
  167. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  168. package/lib/src/embed/ts-embed.js +29 -7
  169. package/lib/src/embed/ts-embed.js.map +1 -1
  170. package/lib/src/embed/ts-embed.spec.js +146 -0
  171. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  172. package/lib/src/errors.d.ts +1 -0
  173. package/lib/src/errors.d.ts.map +1 -1
  174. package/lib/src/errors.js +1 -0
  175. package/lib/src/errors.js.map +1 -1
  176. package/lib/src/index.d.ts +2 -2
  177. package/lib/src/index.d.ts.map +1 -1
  178. package/lib/src/index.js +2 -2
  179. package/lib/src/index.js.map +1 -1
  180. package/lib/src/mixpanel-service.d.ts +4 -0
  181. package/lib/src/mixpanel-service.d.ts.map +1 -1
  182. package/lib/src/mixpanel-service.js +4 -0
  183. package/lib/src/mixpanel-service.js.map +1 -1
  184. package/lib/src/react/util.spec.js +251 -0
  185. package/lib/src/react/util.spec.js.map +1 -1
  186. package/lib/src/types.d.ts +573 -11
  187. package/lib/src/types.d.ts.map +1 -1
  188. package/lib/src/types.js +519 -2
  189. package/lib/src/types.js.map +1 -1
  190. package/lib/src/utils/processData.spec.js +93 -0
  191. package/lib/src/utils/processData.spec.js.map +1 -1
  192. package/lib/src/utils/processTrigger.spec.js +61 -0
  193. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  194. package/lib/src/visual-embed-sdk.d.ts +1161 -46
  195. package/package.json +1 -1
  196. package/src/css-variables.ts +118 -0
  197. package/src/embed/app.spec.ts +530 -183
  198. package/src/embed/app.ts +209 -66
  199. package/src/embed/conversation.spec.ts +275 -21
  200. package/src/embed/conversation.ts +262 -17
  201. package/src/embed/events.spec.ts +757 -1
  202. package/src/embed/host-events.spec.ts +194 -0
  203. package/src/embed/hostEventClient/contracts.ts +57 -14
  204. package/src/embed/hostEventClient/host-event-client.spec.ts +338 -0
  205. package/src/embed/hostEventClient/host-event-client.ts +16 -0
  206. package/src/embed/hostEventClient/utils.spec.ts +204 -0
  207. package/src/embed/hostEventClient/utils.ts +37 -10
  208. package/src/embed/liveboard.spec.ts +108 -2
  209. package/src/embed/liveboard.ts +82 -14
  210. package/src/embed/spotter-utils.spec.ts +68 -1
  211. package/src/embed/spotter-utils.ts +16 -1
  212. package/src/embed/spotter-viz-utils.spec.ts +17 -0
  213. package/src/embed/spotter-viz-utils.ts +34 -0
  214. package/src/embed/ts-embed.spec.ts +186 -0
  215. package/src/embed/ts-embed.ts +30 -4
  216. package/src/errors.ts +1 -0
  217. package/src/index.ts +3 -1
  218. package/src/mixpanel-service.ts +4 -0
  219. package/src/react/util.spec.tsx +255 -0
  220. package/src/types.ts +575 -8
  221. package/src/utils/processData.spec.ts +97 -0
  222. package/src/utils/processTrigger.spec.ts +91 -0
@@ -1170,6 +1170,32 @@ describe('Unit test case for ts embed', () => {
1170
1170
  const { mockGetPreauthInfo } = await setup(true, 123);
1171
1171
  expect(mockGetPreauthInfo).toHaveBeenCalledTimes(0);
1172
1172
  });
1173
+ test('should NOT trigger InfoSuccess when getPreauthInfo resolves with no .info field', async () => {
1174
+ jest.spyOn(window, 'addEventListener').mockImplementationOnce((event, handler) => {
1175
+ handler({
1176
+ data: { type: 'xyz' },
1177
+ ports: [3000],
1178
+ source: null,
1179
+ });
1180
+ });
1181
+ mockProcessTrigger.mockResolvedValueOnce({ session: 'test' });
1182
+ jest.spyOn(authService, 'fetchPreauthInfoService').mockResolvedValueOnce({
1183
+ ok: true,
1184
+ headers: new Headers({ 'content-type': 'application/json' }),
1185
+ json: async () => ({}), // no .info field
1186
+ });
1187
+ const iFrame = document.createElement('div');
1188
+ jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValueOnce(true);
1189
+ const tsEmbed = new SearchEmbed(getRootEl(), {});
1190
+ iFrame.contentWindow = { postMessage: jest.fn() };
1191
+ jest.spyOn(iFrame, 'addEventListener').mockImplementationOnce((event, handler) => { handler({}); });
1192
+ jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
1193
+ await tsEmbed.render();
1194
+ await executeAfterWait(() => {
1195
+ const infoSuccessCall = mockProcessTrigger.mock.calls.find((call) => call[1] === HostEvent.InfoSuccess);
1196
+ expect(infoSuccessCall).toBeUndefined();
1197
+ });
1198
+ });
1173
1199
  });
1174
1200
  describe('Preauth Cache for FullAppEmbed with PrimaryNavBar', () => {
1175
1201
  beforeAll(() => {
@@ -1893,6 +1919,43 @@ describe('Unit test case for ts embed', () => {
1893
1919
  orgId: overrideOrgId,
1894
1920
  });
1895
1921
  });
1922
+ it('Sets the overrideHistoryState param', async () => {
1923
+ const appEmbed = new AppEmbed(getRootEl(), {
1924
+ frameParams: {
1925
+ width: '100%',
1926
+ height: '100%',
1927
+ },
1928
+ overrideHistoryState: true,
1929
+ });
1930
+ await appEmbed.render();
1931
+ expectUrlToHaveParamsWithValues(getIFrameSrc(), {
1932
+ overrideHistoryState: true,
1933
+ });
1934
+ });
1935
+ it('Sets the overrideHistoryState param to false', async () => {
1936
+ const appEmbed = new AppEmbed(getRootEl(), {
1937
+ frameParams: {
1938
+ width: '100%',
1939
+ height: '100%',
1940
+ },
1941
+ overrideHistoryState: false,
1942
+ });
1943
+ await appEmbed.render();
1944
+ expectUrlToHaveParamsWithValues(getIFrameSrc(), {
1945
+ overrideHistoryState: false,
1946
+ });
1947
+ });
1948
+ it('Should not add overrideHistoryState param when it is undefined', async () => {
1949
+ const appEmbed = new AppEmbed(getRootEl(), {
1950
+ frameParams: {
1951
+ width: '100%',
1952
+ height: '100%',
1953
+ },
1954
+ });
1955
+ await appEmbed.render();
1956
+ const url = getIFrameSrc();
1957
+ expect(url).not.toContain('overrideHistoryState');
1958
+ });
1896
1959
  it('Should not add contextMenuEnabledOnWhichClick flag to the iframe src when it is not passed', async () => {
1897
1960
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
1898
1961
  ...defaultViewConfig,
@@ -3723,6 +3786,20 @@ describe('Trigger method edge cases', () => {
3723
3786
  expect(result).toBeNull();
3724
3787
  });
3725
3788
  });
3789
+ test('isValidationError catch: handleError called with embedErrorDetails and error is rethrown', async () => {
3790
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
3791
+ const handleErrorSpy = jest.spyOn(searchEmbed, 'handleError').mockImplementation(() => { });
3792
+ await searchEmbed.render();
3793
+ // First processTrigger call is getAvailableUIPassthroughKeys for DrillDown
3794
+ mockProcessTrigger.mockResolvedValueOnce([
3795
+ { value: { keys: Object.values(UIPassthroughEvent) } },
3796
+ ]);
3797
+ // DrillDown with no points → throwDrillDownValidationError → isValidationError=true
3798
+ await expect(searchEmbed.trigger(HostEvent.DrillDown, {})).rejects.toThrow('DrillDown requires a valid points object');
3799
+ expect(handleErrorSpy).toHaveBeenCalledWith(expect.objectContaining({
3800
+ data: expect.objectContaining({ code: EmbedErrorCodes.HOST_EVENT_VALIDATION }),
3801
+ }));
3802
+ });
3726
3803
  });
3727
3804
  describe('PreRender replaceExistingPreRender scenarios', () => {
3728
3805
  beforeAll(() => {
@@ -3731,6 +3808,9 @@ describe('PreRender replaceExistingPreRender scenarios', () => {
3731
3808
  authType: AuthType.None,
3732
3809
  });
3733
3810
  });
3811
+ beforeEach(() => {
3812
+ document.body.innerHTML = getDocumentBody();
3813
+ });
3734
3814
  afterEach(() => {
3735
3815
  const rootEle = document.getElementById('myRoot');
3736
3816
  rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
@@ -3838,6 +3918,40 @@ describe('Fullscreen change handler behavior', () => {
3838
3918
  expect(mockProcessTrigger).not.toHaveBeenCalledWith(expect.any(Object), HostEvent.ExitPresentMode, expect.any(String), expect.any(Object));
3839
3919
  });
3840
3920
  });
3921
+ test('disableFullscreenPresentation undefined defaults to true — no fullscreenchange listener registered', () => {
3922
+ init({
3923
+ thoughtSpotHost: 'tshost',
3924
+ authType: AuthType.None,
3925
+ // disableFullscreenPresentation not set → defaults to true via ?? true
3926
+ });
3927
+ const embed = new SearchEmbed(getRootEl(), defaultViewConfig);
3928
+ const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
3929
+ embed['setupFullscreenChangeHandler']();
3930
+ expect(addEventListenerSpy).not.toHaveBeenCalledWith('fullscreenchange', expect.any(Function));
3931
+ addEventListenerSpy.mockRestore();
3932
+ // Restore for other tests in this describe
3933
+ init({ thoughtSpotHost: 'tshost', authType: AuthType.None, disableFullscreenPresentation: false });
3934
+ });
3935
+ test('fullscreenchange fires but iFrame.contentWindow is null — trigger NOT called, debug log emitted', () => {
3936
+ const embed = new SearchEmbed(getRootEl(), defaultViewConfig);
3937
+ // Give the embed a fake iFrame with null contentWindow
3938
+ embed.iFrame = { contentWindow: null };
3939
+ const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
3940
+ const loggerDebugSpy = jest.spyOn(logger, 'debug').mockImplementation(() => { });
3941
+ const triggerSpy = jest.spyOn(embed, 'trigger').mockImplementation(() => Promise.resolve(null));
3942
+ embed['setupFullscreenChangeHandler']();
3943
+ // Capture the registered handler directly instead of dispatching to document
3944
+ const fullscreenCall = addEventListenerSpy.mock.calls.find((c) => c[0] === 'fullscreenchange');
3945
+ expect(fullscreenCall).toBeTruthy();
3946
+ const handler = fullscreenCall[1];
3947
+ Object.defineProperty(document, 'fullscreenElement', { value: null, writable: true, configurable: true });
3948
+ handler(new Event('fullscreenchange'));
3949
+ expect(triggerSpy).not.toHaveBeenCalled();
3950
+ expect(loggerDebugSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping ExitPresentMode'));
3951
+ addEventListenerSpy.mockRestore();
3952
+ loggerDebugSpy.mockRestore();
3953
+ triggerSpy.mockRestore();
3954
+ });
3841
3955
  });
3842
3956
  describe('ShowPreRender with UpdateEmbedParams', () => {
3843
3957
  const setupPreRenderTest = async (preRenderId, initialConfig) => {
@@ -4294,6 +4408,38 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
4294
4408
  expect(placeholderEle.parentElement).not.toBeNull();
4295
4409
  embed.destroy();
4296
4410
  });
4411
+ // showPreRender located the stale placeholder with a subtree-wide
4412
+ // querySelector but removed it with hostElement.removeChild(), which
4413
+ // only accepts direct children. With fullHeight the placeholder can be
4414
+ // nested deeper than a direct child, so removeChild threw
4415
+ // "NotFoundError: Failed to execute 'removeChild' on 'Node'".
4416
+ it('showPreRender removes a placeholder nested below a direct child without throwing', async () => {
4417
+ createRootEleForEmbed();
4418
+ const embed = new LiveboardEmbed('#tsEmbedDiv', {
4419
+ preRenderId: 'ph-nested-test',
4420
+ liveboardId: 'lb-id',
4421
+ fullHeight: true,
4422
+ });
4423
+ await embed.preRender();
4424
+ await waitFor(() => !!document.querySelector('#tsEmbed-pre-render-child-ph-nested-test'));
4425
+ const hostElement = document.querySelector('#tsEmbedDiv');
4426
+ const placeHolderId = 'tsEmbed-pre-render-placeholder-ph-nested-test';
4427
+ // Simulate the fullHeight layout where the placeholder ends up as
4428
+ // a grandchild of the host element rather than a direct child.
4429
+ const intermediateWrapper = document.createElement('div');
4430
+ const staleNestedPlaceholder = document.createElement('div');
4431
+ staleNestedPlaceholder.id = placeHolderId;
4432
+ intermediateWrapper.appendChild(staleNestedPlaceholder);
4433
+ hostElement.appendChild(intermediateWrapper);
4434
+ expect(hostElement.querySelector(`#${placeHolderId}`)).toBe(staleNestedPlaceholder);
4435
+ // Before the fix this threw NotFoundError.
4436
+ await expect(embed.showPreRender()).resolves.toBeDefined();
4437
+ // The stale nested placeholder is gone; the fresh one is a direct child.
4438
+ expect(staleNestedPlaceholder.isConnected).toBe(false);
4439
+ const currentPlaceholder = embed.getPreRenderPlaceHolderElement();
4440
+ expect(currentPlaceholder.parentElement).toBe(hostElement);
4441
+ embed.destroy();
4442
+ });
4297
4443
  });
4298
4444
  });
4299
4445
  //# sourceMappingURL=ts-embed.spec.js.map