@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
@@ -1174,6 +1174,32 @@ describe('Unit test case for ts embed', () => {
1174
1174
  const { mockGetPreauthInfo } = await setup(true, 123);
1175
1175
  expect(mockGetPreauthInfo).toHaveBeenCalledTimes(0);
1176
1176
  });
1177
+ test('should NOT trigger InfoSuccess when getPreauthInfo resolves with no .info field', async () => {
1178
+ jest.spyOn(window, 'addEventListener').mockImplementationOnce((event, handler) => {
1179
+ handler({
1180
+ data: { type: 'xyz' },
1181
+ ports: [3000],
1182
+ source: null,
1183
+ });
1184
+ });
1185
+ mockProcessTrigger.mockResolvedValueOnce({ session: 'test' });
1186
+ jest.spyOn(authService, 'fetchPreauthInfoService').mockResolvedValueOnce({
1187
+ ok: true,
1188
+ headers: new Headers({ 'content-type': 'application/json' }),
1189
+ json: async () => ({}), // no .info field
1190
+ });
1191
+ const iFrame = document.createElement('div');
1192
+ jest.spyOn(baseInstance, 'getAuthPromise').mockResolvedValueOnce(true);
1193
+ const tsEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {});
1194
+ iFrame.contentWindow = { postMessage: jest.fn() };
1195
+ jest.spyOn(iFrame, 'addEventListener').mockImplementationOnce((event, handler) => { handler({}); });
1196
+ jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
1197
+ await tsEmbed.render();
1198
+ await (0, test_utils_1.executeAfterWait)(() => {
1199
+ const infoSuccessCall = mockProcessTrigger.mock.calls.find((call) => call[1] === types_1.HostEvent.InfoSuccess);
1200
+ expect(infoSuccessCall).toBeUndefined();
1201
+ });
1202
+ });
1177
1203
  });
1178
1204
  describe('Preauth Cache for FullAppEmbed with PrimaryNavBar', () => {
1179
1205
  beforeAll(() => {
@@ -1897,6 +1923,43 @@ describe('Unit test case for ts embed', () => {
1897
1923
  orgId: overrideOrgId,
1898
1924
  });
1899
1925
  });
1926
+ it('Sets the overrideHistoryState param', async () => {
1927
+ const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1928
+ frameParams: {
1929
+ width: '100%',
1930
+ height: '100%',
1931
+ },
1932
+ overrideHistoryState: true,
1933
+ });
1934
+ await appEmbed.render();
1935
+ (0, test_utils_1.expectUrlToHaveParamsWithValues)((0, test_utils_1.getIFrameSrc)(), {
1936
+ overrideHistoryState: true,
1937
+ });
1938
+ });
1939
+ it('Sets the overrideHistoryState param to false', async () => {
1940
+ const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1941
+ frameParams: {
1942
+ width: '100%',
1943
+ height: '100%',
1944
+ },
1945
+ overrideHistoryState: false,
1946
+ });
1947
+ await appEmbed.render();
1948
+ (0, test_utils_1.expectUrlToHaveParamsWithValues)((0, test_utils_1.getIFrameSrc)(), {
1949
+ overrideHistoryState: false,
1950
+ });
1951
+ });
1952
+ it('Should not add overrideHistoryState param when it is undefined', async () => {
1953
+ const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
1954
+ frameParams: {
1955
+ width: '100%',
1956
+ height: '100%',
1957
+ },
1958
+ });
1959
+ await appEmbed.render();
1960
+ const url = (0, test_utils_1.getIFrameSrc)();
1961
+ expect(url).not.toContain('overrideHistoryState');
1962
+ });
1900
1963
  it('Should not add contextMenuEnabledOnWhichClick flag to the iframe src when it is not passed', async () => {
1901
1964
  const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
1902
1965
  ...defaultViewConfig,
@@ -3727,6 +3790,20 @@ describe('Trigger method edge cases', () => {
3727
3790
  expect(result).toBeNull();
3728
3791
  });
3729
3792
  });
3793
+ test('isValidationError catch: handleError called with embedErrorDetails and error is rethrown', async () => {
3794
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3795
+ const handleErrorSpy = jest.spyOn(searchEmbed, 'handleError').mockImplementation(() => { });
3796
+ await searchEmbed.render();
3797
+ // First processTrigger call is getAvailableUIPassthroughKeys for DrillDown
3798
+ mockProcessTrigger.mockResolvedValueOnce([
3799
+ { value: { keys: Object.values(contracts_1.UIPassthroughEvent) } },
3800
+ ]);
3801
+ // DrillDown with no points → throwDrillDownValidationError → isValidationError=true
3802
+ await expect(searchEmbed.trigger(types_1.HostEvent.DrillDown, {})).rejects.toThrow('DrillDown requires a valid points object');
3803
+ expect(handleErrorSpy).toHaveBeenCalledWith(expect.objectContaining({
3804
+ data: expect.objectContaining({ code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION }),
3805
+ }));
3806
+ });
3730
3807
  });
3731
3808
  describe('PreRender replaceExistingPreRender scenarios', () => {
3732
3809
  beforeAll(() => {
@@ -3735,6 +3812,9 @@ describe('PreRender replaceExistingPreRender scenarios', () => {
3735
3812
  authType: index_1.AuthType.None,
3736
3813
  });
3737
3814
  });
3815
+ beforeEach(() => {
3816
+ document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
3817
+ });
3738
3818
  afterEach(() => {
3739
3819
  const rootEle = document.getElementById('myRoot');
3740
3820
  rootEle === null || rootEle === void 0 ? void 0 : rootEle.remove();
@@ -3842,6 +3922,40 @@ describe('Fullscreen change handler behavior', () => {
3842
3922
  expect(mockProcessTrigger).not.toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.ExitPresentMode, expect.any(String), expect.any(Object));
3843
3923
  });
3844
3924
  });
3925
+ test('disableFullscreenPresentation undefined defaults to true — no fullscreenchange listener registered', () => {
3926
+ (0, index_1.init)({
3927
+ thoughtSpotHost: 'tshost',
3928
+ authType: index_1.AuthType.None,
3929
+ // disableFullscreenPresentation not set → defaults to true via ?? true
3930
+ });
3931
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3932
+ const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
3933
+ embed['setupFullscreenChangeHandler']();
3934
+ expect(addEventListenerSpy).not.toHaveBeenCalledWith('fullscreenchange', expect.any(Function));
3935
+ addEventListenerSpy.mockRestore();
3936
+ // Restore for other tests in this describe
3937
+ (0, index_1.init)({ thoughtSpotHost: 'tshost', authType: index_1.AuthType.None, disableFullscreenPresentation: false });
3938
+ });
3939
+ test('fullscreenchange fires but iFrame.contentWindow is null — trigger NOT called, debug log emitted', () => {
3940
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3941
+ // Give the embed a fake iFrame with null contentWindow
3942
+ embed.iFrame = { contentWindow: null };
3943
+ const addEventListenerSpy = jest.spyOn(document, 'addEventListener');
3944
+ const loggerDebugSpy = jest.spyOn(logger_1.logger, 'debug').mockImplementation(() => { });
3945
+ const triggerSpy = jest.spyOn(embed, 'trigger').mockImplementation(() => Promise.resolve(null));
3946
+ embed['setupFullscreenChangeHandler']();
3947
+ // Capture the registered handler directly instead of dispatching to document
3948
+ const fullscreenCall = addEventListenerSpy.mock.calls.find((c) => c[0] === 'fullscreenchange');
3949
+ expect(fullscreenCall).toBeTruthy();
3950
+ const handler = fullscreenCall[1];
3951
+ Object.defineProperty(document, 'fullscreenElement', { value: null, writable: true, configurable: true });
3952
+ handler(new Event('fullscreenchange'));
3953
+ expect(triggerSpy).not.toHaveBeenCalled();
3954
+ expect(loggerDebugSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping ExitPresentMode'));
3955
+ addEventListenerSpy.mockRestore();
3956
+ loggerDebugSpy.mockRestore();
3957
+ triggerSpy.mockRestore();
3958
+ });
3845
3959
  });
3846
3960
  describe('ShowPreRender with UpdateEmbedParams', () => {
3847
3961
  const setupPreRenderTest = async (preRenderId, initialConfig) => {
@@ -4298,6 +4412,38 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
4298
4412
  expect(placeholderEle.parentElement).not.toBeNull();
4299
4413
  embed.destroy();
4300
4414
  });
4415
+ // showPreRender located the stale placeholder with a subtree-wide
4416
+ // querySelector but removed it with hostElement.removeChild(), which
4417
+ // only accepts direct children. With fullHeight the placeholder can be
4418
+ // nested deeper than a direct child, so removeChild threw
4419
+ // "NotFoundError: Failed to execute 'removeChild' on 'Node'".
4420
+ it('showPreRender removes a placeholder nested below a direct child without throwing', async () => {
4421
+ (0, test_utils_1.createRootEleForEmbed)();
4422
+ const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4423
+ preRenderId: 'ph-nested-test',
4424
+ liveboardId: 'lb-id',
4425
+ fullHeight: true,
4426
+ });
4427
+ await embed.preRender();
4428
+ await (0, test_utils_1.waitFor)(() => !!document.querySelector('#tsEmbed-pre-render-child-ph-nested-test'));
4429
+ const hostElement = document.querySelector('#tsEmbedDiv');
4430
+ const placeHolderId = 'tsEmbed-pre-render-placeholder-ph-nested-test';
4431
+ // Simulate the fullHeight layout where the placeholder ends up as
4432
+ // a grandchild of the host element rather than a direct child.
4433
+ const intermediateWrapper = document.createElement('div');
4434
+ const staleNestedPlaceholder = document.createElement('div');
4435
+ staleNestedPlaceholder.id = placeHolderId;
4436
+ intermediateWrapper.appendChild(staleNestedPlaceholder);
4437
+ hostElement.appendChild(intermediateWrapper);
4438
+ expect(hostElement.querySelector(`#${placeHolderId}`)).toBe(staleNestedPlaceholder);
4439
+ // Before the fix this threw NotFoundError.
4440
+ await expect(embed.showPreRender()).resolves.toBeDefined();
4441
+ // The stale nested placeholder is gone; the fresh one is a direct child.
4442
+ expect(staleNestedPlaceholder.isConnected).toBe(false);
4443
+ const currentPlaceholder = embed.getPreRenderPlaceHolderElement();
4444
+ expect(currentPlaceholder.parentElement).toBe(hostElement);
4445
+ embed.destroy();
4446
+ });
4301
4447
  });
4302
4448
  });
4303
4449
  //# sourceMappingURL=ts-embed.spec.js.map