@thoughtspot/visual-embed-sdk 1.47.3 → 1.49.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 (244) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/auth.d.ts.map +1 -1
  3. package/cjs/src/auth.js +11 -1
  4. package/cjs/src/auth.js.map +1 -1
  5. package/cjs/src/auth.spec.js +38 -0
  6. package/cjs/src/auth.spec.js.map +1 -1
  7. package/cjs/src/authToken.d.ts +2 -0
  8. package/cjs/src/authToken.d.ts.map +1 -1
  9. package/cjs/src/authToken.js +7 -5
  10. package/cjs/src/authToken.js.map +1 -1
  11. package/cjs/src/css-variables.d.ts +140 -0
  12. package/cjs/src/css-variables.d.ts.map +1 -1
  13. package/cjs/src/embed/app.d.ts +63 -2
  14. package/cjs/src/embed/app.d.ts.map +1 -1
  15. package/cjs/src/embed/app.js +57 -6
  16. package/cjs/src/embed/app.js.map +1 -1
  17. package/cjs/src/embed/app.spec.js +200 -1
  18. package/cjs/src/embed/app.spec.js.map +1 -1
  19. package/cjs/src/embed/auto-frame-renderer.js +7 -2
  20. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  21. package/cjs/src/embed/auto-frame-renderer.spec.js +385 -6
  22. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  23. package/cjs/src/embed/base.d.ts +1 -0
  24. package/cjs/src/embed/base.d.ts.map +1 -1
  25. package/cjs/src/embed/base.js +13 -1
  26. package/cjs/src/embed/base.js.map +1 -1
  27. package/cjs/src/embed/base.spec.js +21 -0
  28. package/cjs/src/embed/base.spec.js.map +1 -1
  29. package/cjs/src/embed/bodyless-conversation.spec.js +86 -0
  30. package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
  31. package/cjs/src/embed/conversation.d.ts +16 -1
  32. package/cjs/src/embed/conversation.d.ts.map +1 -1
  33. package/cjs/src/embed/conversation.js +5 -1
  34. package/cjs/src/embed/conversation.js.map +1 -1
  35. package/cjs/src/embed/conversation.spec.js +26 -0
  36. package/cjs/src/embed/conversation.spec.js.map +1 -1
  37. package/cjs/src/embed/liveboard.d.ts +48 -2
  38. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  39. package/cjs/src/embed/liveboard.js +48 -7
  40. package/cjs/src/embed/liveboard.js.map +1 -1
  41. package/cjs/src/embed/liveboard.spec.js +139 -1
  42. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  43. package/cjs/src/embed/spotter-viz-utils.d.ts +85 -0
  44. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -0
  45. package/cjs/src/embed/spotter-viz-utils.js +17 -0
  46. package/cjs/src/embed/spotter-viz-utils.js.map +1 -0
  47. package/cjs/src/embed/spotter-viz-utils.spec.d.ts +2 -0
  48. package/cjs/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
  49. package/cjs/src/embed/spotter-viz-utils.spec.js +31 -0
  50. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -0
  51. package/cjs/src/embed/ts-embed.d.ts +58 -38
  52. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  53. package/cjs/src/embed/ts-embed.js +247 -151
  54. package/cjs/src/embed/ts-embed.js.map +1 -1
  55. package/cjs/src/embed/ts-embed.spec.js +397 -122
  56. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  57. package/cjs/src/index.d.ts +2 -1
  58. package/cjs/src/index.d.ts.map +1 -1
  59. package/cjs/src/index.js.map +1 -1
  60. package/cjs/src/react/index.d.ts.map +1 -1
  61. package/cjs/src/react/index.js +3 -0
  62. package/cjs/src/react/index.js.map +1 -1
  63. package/cjs/src/tokenizedFetch.d.ts.map +1 -1
  64. package/cjs/src/tokenizedFetch.js +12 -9
  65. package/cjs/src/tokenizedFetch.js.map +1 -1
  66. package/cjs/src/tokenizedFetch.spec.d.ts +2 -0
  67. package/cjs/src/tokenizedFetch.spec.d.ts.map +1 -0
  68. package/cjs/src/tokenizedFetch.spec.js +68 -0
  69. package/cjs/src/tokenizedFetch.spec.js.map +1 -0
  70. package/cjs/src/types.d.ts +309 -40
  71. package/cjs/src/types.d.ts.map +1 -1
  72. package/cjs/src/types.js +251 -23
  73. package/cjs/src/types.js.map +1 -1
  74. package/cjs/src/utils/authService/tokenizedAuthService.spec.js +6 -7
  75. package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  76. package/cjs/src/utils/logger.js +2 -1
  77. package/cjs/src/utils/logger.js.map +1 -1
  78. package/cjs/src/utils/logger.spec.d.ts +1 -0
  79. package/cjs/src/utils/logger.spec.d.ts.map +1 -1
  80. package/cjs/src/utils/logger.spec.js +10 -9
  81. package/cjs/src/utils/logger.spec.js.map +1 -1
  82. package/cjs/src/utils.d.ts +4 -1
  83. package/cjs/src/utils.d.ts.map +1 -1
  84. package/cjs/src/utils.js +107 -10
  85. package/cjs/src/utils.js.map +1 -1
  86. package/cjs/src/utils.spec.js +163 -4
  87. package/cjs/src/utils.spec.js.map +1 -1
  88. package/dist/{index-DZq20cR6.js → index-_UGCSSDR.js} +1 -1
  89. package/dist/src/auth.d.ts.map +1 -1
  90. package/dist/src/authToken.d.ts +2 -0
  91. package/dist/src/authToken.d.ts.map +1 -1
  92. package/dist/src/css-variables.d.ts +140 -0
  93. package/dist/src/css-variables.d.ts.map +1 -1
  94. package/dist/src/embed/app.d.ts +63 -2
  95. package/dist/src/embed/app.d.ts.map +1 -1
  96. package/dist/src/embed/base.d.ts +1 -0
  97. package/dist/src/embed/base.d.ts.map +1 -1
  98. package/dist/src/embed/conversation.d.ts +16 -1
  99. package/dist/src/embed/conversation.d.ts.map +1 -1
  100. package/dist/src/embed/liveboard.d.ts +48 -2
  101. package/dist/src/embed/liveboard.d.ts.map +1 -1
  102. package/dist/src/embed/spotter-viz-utils.d.ts +85 -0
  103. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -0
  104. package/dist/src/embed/spotter-viz-utils.spec.d.ts +2 -0
  105. package/dist/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
  106. package/dist/src/embed/ts-embed.d.ts +58 -38
  107. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  108. package/dist/src/index.d.ts +2 -1
  109. package/dist/src/index.d.ts.map +1 -1
  110. package/dist/src/react/index.d.ts.map +1 -1
  111. package/dist/src/tokenizedFetch.d.ts.map +1 -1
  112. package/dist/src/tokenizedFetch.spec.d.ts +2 -0
  113. package/dist/src/tokenizedFetch.spec.d.ts.map +1 -0
  114. package/dist/src/types.d.ts +309 -40
  115. package/dist/src/types.d.ts.map +1 -1
  116. package/dist/src/utils/logger.spec.d.ts +1 -0
  117. package/dist/src/utils/logger.spec.d.ts.map +1 -1
  118. package/dist/src/utils.d.ts +4 -1
  119. package/dist/src/utils.d.ts.map +1 -1
  120. package/dist/tsembed-react.es.js +3418 -2899
  121. package/dist/tsembed-react.js +3420 -2901
  122. package/dist/tsembed.es.js +3426 -2905
  123. package/dist/tsembed.js +3419 -2898
  124. package/dist/visual-embed-sdk-react-full.d.ts +687 -78
  125. package/dist/visual-embed-sdk-react.d.ts +687 -78
  126. package/dist/visual-embed-sdk.d.ts +702 -80
  127. package/lib/package.json +1 -1
  128. package/lib/src/auth.d.ts.map +1 -1
  129. package/lib/src/auth.js +12 -2
  130. package/lib/src/auth.js.map +1 -1
  131. package/lib/src/auth.spec.js +38 -0
  132. package/lib/src/auth.spec.js.map +1 -1
  133. package/lib/src/authToken.d.ts +2 -0
  134. package/lib/src/authToken.d.ts.map +1 -1
  135. package/lib/src/authToken.js +2 -2
  136. package/lib/src/authToken.js.map +1 -1
  137. package/lib/src/css-variables.d.ts +140 -0
  138. package/lib/src/css-variables.d.ts.map +1 -1
  139. package/lib/src/embed/app.d.ts +63 -2
  140. package/lib/src/embed/app.d.ts.map +1 -1
  141. package/lib/src/embed/app.js +58 -7
  142. package/lib/src/embed/app.js.map +1 -1
  143. package/lib/src/embed/app.spec.js +201 -2
  144. package/lib/src/embed/app.spec.js.map +1 -1
  145. package/lib/src/embed/auto-frame-renderer.js +7 -2
  146. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  147. package/lib/src/embed/auto-frame-renderer.spec.js +387 -8
  148. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  149. package/lib/src/embed/base.d.ts +1 -0
  150. package/lib/src/embed/base.d.ts.map +1 -1
  151. package/lib/src/embed/base.js +11 -0
  152. package/lib/src/embed/base.js.map +1 -1
  153. package/lib/src/embed/base.spec.js +22 -1
  154. package/lib/src/embed/base.spec.js.map +1 -1
  155. package/lib/src/embed/bodyless-conversation.spec.js +86 -0
  156. package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
  157. package/lib/src/embed/conversation.d.ts +16 -1
  158. package/lib/src/embed/conversation.d.ts.map +1 -1
  159. package/lib/src/embed/conversation.js +5 -1
  160. package/lib/src/embed/conversation.js.map +1 -1
  161. package/lib/src/embed/conversation.spec.js +27 -1
  162. package/lib/src/embed/conversation.spec.js.map +1 -1
  163. package/lib/src/embed/liveboard.d.ts +48 -2
  164. package/lib/src/embed/liveboard.d.ts.map +1 -1
  165. package/lib/src/embed/liveboard.js +49 -8
  166. package/lib/src/embed/liveboard.js.map +1 -1
  167. package/lib/src/embed/liveboard.spec.js +139 -1
  168. package/lib/src/embed/liveboard.spec.js.map +1 -1
  169. package/lib/src/embed/spotter-viz-utils.d.ts +85 -0
  170. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -0
  171. package/lib/src/embed/spotter-viz-utils.js +13 -0
  172. package/lib/src/embed/spotter-viz-utils.js.map +1 -0
  173. package/lib/src/embed/spotter-viz-utils.spec.d.ts +2 -0
  174. package/lib/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
  175. package/lib/src/embed/spotter-viz-utils.spec.js +29 -0
  176. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -0
  177. package/lib/src/embed/ts-embed.d.ts +58 -38
  178. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  179. package/lib/src/embed/ts-embed.js +250 -154
  180. package/lib/src/embed/ts-embed.js.map +1 -1
  181. package/lib/src/embed/ts-embed.spec.js +397 -122
  182. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  183. package/lib/src/index.d.ts +2 -1
  184. package/lib/src/index.d.ts.map +1 -1
  185. package/lib/src/index.js.map +1 -1
  186. package/lib/src/react/index.d.ts.map +1 -1
  187. package/lib/src/react/index.js +3 -0
  188. package/lib/src/react/index.js.map +1 -1
  189. package/lib/src/tokenizedFetch.d.ts.map +1 -1
  190. package/lib/src/tokenizedFetch.js +13 -10
  191. package/lib/src/tokenizedFetch.js.map +1 -1
  192. package/lib/src/tokenizedFetch.spec.d.ts +2 -0
  193. package/lib/src/tokenizedFetch.spec.d.ts.map +1 -0
  194. package/lib/src/tokenizedFetch.spec.js +65 -0
  195. package/lib/src/tokenizedFetch.spec.js.map +1 -0
  196. package/lib/src/types.d.ts +309 -40
  197. package/lib/src/types.d.ts.map +1 -1
  198. package/lib/src/types.js +251 -23
  199. package/lib/src/types.js.map +1 -1
  200. package/lib/src/utils/authService/tokenizedAuthService.spec.js +6 -7
  201. package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  202. package/lib/src/utils/logger.js +2 -1
  203. package/lib/src/utils/logger.js.map +1 -1
  204. package/lib/src/utils/logger.spec.d.ts +1 -0
  205. package/lib/src/utils/logger.spec.d.ts.map +1 -1
  206. package/lib/src/utils/logger.spec.js +10 -9
  207. package/lib/src/utils/logger.spec.js.map +1 -1
  208. package/lib/src/utils.d.ts +4 -1
  209. package/lib/src/utils.d.ts.map +1 -1
  210. package/lib/src/utils.js +103 -9
  211. package/lib/src/utils.js.map +1 -1
  212. package/lib/src/utils.spec.js +164 -5
  213. package/lib/src/utils.spec.js.map +1 -1
  214. package/lib/src/visual-embed-sdk.d.ts +702 -80
  215. package/package.json +1 -1
  216. package/src/auth.spec.ts +55 -1
  217. package/src/auth.ts +11 -2
  218. package/src/authToken.ts +2 -2
  219. package/src/css-variables.ts +175 -1
  220. package/src/embed/app.spec.ts +260 -3
  221. package/src/embed/app.ts +127 -7
  222. package/src/embed/auto-frame-renderer.spec.ts +457 -58
  223. package/src/embed/auto-frame-renderer.ts +7 -2
  224. package/src/embed/base.spec.ts +25 -1
  225. package/src/embed/base.ts +19 -5
  226. package/src/embed/bodyless-conversation.spec.ts +93 -0
  227. package/src/embed/conversation.spec.ts +34 -0
  228. package/src/embed/conversation.ts +22 -1
  229. package/src/embed/liveboard.spec.ts +163 -1
  230. package/src/embed/liveboard.ts +106 -10
  231. package/src/embed/spotter-viz-utils.spec.ts +30 -0
  232. package/src/embed/spotter-viz-utils.ts +94 -0
  233. package/src/embed/ts-embed.spec.ts +564 -231
  234. package/src/embed/ts-embed.ts +384 -258
  235. package/src/index.ts +3 -0
  236. package/src/react/index.tsx +3 -0
  237. package/src/tokenizedFetch.spec.ts +81 -0
  238. package/src/tokenizedFetch.ts +14 -11
  239. package/src/types.ts +326 -36
  240. package/src/utils/authService/tokenizedAuthService.spec.ts +6 -6
  241. package/src/utils/logger.spec.ts +11 -9
  242. package/src/utils/logger.ts +2 -2
  243. package/src/utils.spec.ts +200 -4
  244. package/src/utils.ts +128 -9
@@ -50,6 +50,7 @@ beforeAll(() => {
50
50
  const customisations = {
51
51
  style: {
52
52
  customCSS: {},
53
+ customCSSUrl: undefined,
53
54
  },
54
55
  content: {},
55
56
  };
@@ -82,6 +83,9 @@ const getMockAppInitPayload = (data) => {
82
83
  customVariablesForThirdPartyTools,
83
84
  interceptTimeout: undefined,
84
85
  interceptUrls: [],
86
+ shouldBypassPayloadValidation: undefined,
87
+ useHostEventsV2: undefined,
88
+ embedExpiryInAuthToken: true,
85
89
  };
86
90
  return {
87
91
  type: index_1.EmbedEvent.APP_INIT,
@@ -370,7 +374,10 @@ describe('Unit test case for ts embed', () => {
370
374
  });
371
375
  await (0, test_utils_1.executeAfterWait)(() => {
372
376
  expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
373
- reorderedHomepageModules: [types_1.HomepageModule.MyLibrary, types_1.HomepageModule.Watchlist],
377
+ reorderedHomepageModules: [
378
+ types_1.HomepageModule.MyLibrary,
379
+ types_1.HomepageModule.Watchlist,
380
+ ],
374
381
  }));
375
382
  });
376
383
  });
@@ -516,10 +523,38 @@ describe('Unit test case for ts embed', () => {
516
523
  });
517
524
  await (0, test_utils_1.executeAfterWait)(() => {
518
525
  expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
519
- hiddenHomeLeftNavItems: [types_1.HomeLeftNavItem.Home, types_1.HomeLeftNavItem.MonitorSubscription],
526
+ hiddenHomeLeftNavItems: [
527
+ types_1.HomeLeftNavItem.Home,
528
+ types_1.HomeLeftNavItem.MonitorSubscription,
529
+ ],
520
530
  }));
521
531
  });
522
532
  });
533
+ test.each([
534
+ ['not set', undefined, true],
535
+ ['false', false, false],
536
+ ['true', true, true],
537
+ ])('embedExpiryInAuthToken is %s when refreshAuthTokenOnNearExpiry is %s', async (_label, refreshAuthTokenOnNearExpiry, expectedEmbedExpiry) => {
538
+ const mockEmbedEventPayload = {
539
+ type: index_1.EmbedEvent.APP_INIT,
540
+ data: {},
541
+ };
542
+ const searchEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
543
+ ...defaultViewConfig,
544
+ refreshAuthTokenOnNearExpiry,
545
+ });
546
+ searchEmbed.render();
547
+ const mockPort = {
548
+ postMessage: jest.fn(),
549
+ };
550
+ await (0, test_utils_1.executeAfterWait)(() => {
551
+ const iframe = (0, test_utils_1.getIFrameEl)();
552
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
553
+ });
554
+ await (0, test_utils_1.executeAfterWait)(() => {
555
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({ embedExpiryInAuthToken: expectedEmbedExpiry }));
556
+ });
557
+ });
523
558
  test('when Embed event status have start status', (done) => {
524
559
  const mockEmbedEventPayload = {
525
560
  type: index_1.EmbedEvent.Save,
@@ -719,10 +754,8 @@ describe('Unit test case for ts embed', () => {
719
754
  customVariablesForThirdPartyTools: {},
720
755
  }));
721
756
  const customisationContent = mockPort.postMessage.mock.calls[0][0].data.customisations.content;
722
- expect(customisationContent.stringIDsUrl)
723
- .toBe('https://sample-string-ids-url.com');
724
- expect(customisationContent.stringIDs)
725
- .toEqual({
757
+ expect(customisationContent.stringIDsUrl).toBe('https://sample-string-ids-url.com');
758
+ expect(customisationContent.stringIDs).toEqual({
726
759
  'liveboard.header.title': 'Dashboard name',
727
760
  });
728
761
  });
@@ -732,7 +765,10 @@ describe('Unit test case for ts embed', () => {
732
765
  type: index_1.EmbedEvent.APP_INIT,
733
766
  data: {},
734
767
  };
735
- const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), { ...defaultViewConfig, exposeTranslationIDs: true });
768
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
769
+ ...defaultViewConfig,
770
+ exposeTranslationIDs: true,
771
+ });
736
772
  searchEmbed.render();
737
773
  const mockPort = {
738
774
  postMessage: jest.fn(),
@@ -773,16 +809,16 @@ describe('Unit test case for ts embed', () => {
773
809
  name: 'Valid Action',
774
810
  target: types_1.CustomActionTarget.LIVEBOARD,
775
811
  position: types_1.CustomActionsPosition.PRIMARY,
776
- metadataIds: { liveboardIds: ['lb123'] }
812
+ metadataIds: { liveboardIds: ['lb123'] },
777
813
  },
778
814
  {
779
815
  id: 'action2',
780
816
  name: 'Another Valid Action',
781
817
  target: types_1.CustomActionTarget.VIZ,
782
818
  position: types_1.CustomActionsPosition.MENU,
783
- metadataIds: { vizIds: ['viz456'] }
784
- }
785
- ]
819
+ metadataIds: { vizIds: ['viz456'] },
820
+ },
821
+ ],
786
822
  });
787
823
  searchEmbed.render();
788
824
  const mockPort = {
@@ -808,15 +844,15 @@ describe('Unit test case for ts embed', () => {
808
844
  name: 'Another Valid Action',
809
845
  target: types_1.CustomActionTarget.VIZ,
810
846
  position: types_1.CustomActionsPosition.MENU,
811
- metadataIds: { vizIds: ['viz456'] }
847
+ metadataIds: { vizIds: ['viz456'] },
812
848
  },
813
849
  {
814
850
  id: 'action1',
815
851
  name: 'Valid Action',
816
852
  target: types_1.CustomActionTarget.LIVEBOARD,
817
853
  position: types_1.CustomActionsPosition.PRIMARY,
818
- metadataIds: { liveboardIds: ['lb123'] }
819
- }
854
+ metadataIds: { liveboardIds: ['lb123'] },
855
+ },
820
856
  ],
821
857
  customVariablesForThirdPartyTools: {},
822
858
  }));
@@ -829,14 +865,14 @@ describe('Unit test case for ts embed', () => {
829
865
  id: 'action1',
830
866
  name: 'Valid Action',
831
867
  target: types_1.CustomActionTarget.LIVEBOARD,
832
- position: types_1.CustomActionsPosition.PRIMARY
868
+ position: types_1.CustomActionsPosition.PRIMARY,
833
869
  }),
834
870
  expect.objectContaining({
835
871
  id: 'action2',
836
872
  name: 'Another Valid Action',
837
873
  target: types_1.CustomActionTarget.VIZ,
838
- position: types_1.CustomActionsPosition.MENU
839
- })
874
+ position: types_1.CustomActionsPosition.MENU,
875
+ }),
840
876
  ]));
841
877
  // Verify actions are sorted by name (alphabetically)
842
878
  expect(appInitData.customActions[0].name).toBe('Another Valid Action');
@@ -890,7 +926,10 @@ describe('Unit test case for ts embed', () => {
890
926
  type: index_1.EmbedEvent.APP_INIT,
891
927
  data: {},
892
928
  };
893
- const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), { ...defaultViewConfig, preRenderId: 'test' });
929
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
930
+ ...defaultViewConfig,
931
+ preRenderId: 'test',
932
+ });
894
933
  searchEmbed.preRender();
895
934
  const mockPort = {
896
935
  postMessage: jest.fn(),
@@ -941,7 +980,10 @@ describe('Unit test case for ts embed', () => {
941
980
  type: index_1.EmbedEvent.AuthExpire,
942
981
  data: {},
943
982
  };
944
- const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), { ...defaultViewConfig, preRenderId: 'test' });
983
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
984
+ ...defaultViewConfig,
985
+ preRenderId: 'test',
986
+ });
945
987
  jest.spyOn(baseInstance, 'notifyAuthFailure');
946
988
  searchEmbed.preRender();
947
989
  const loggerSpy = jest.spyOn(logger_1.logger, 'error').mockImplementation(() => { });
@@ -1081,9 +1123,13 @@ describe('Unit test case for ts embed', () => {
1081
1123
  // resetCachedPreauthInfo();
1082
1124
  let mockGetPreauthInfo = null;
1083
1125
  if (overrideOrgId) {
1084
- mockGetPreauthInfo = jest.spyOn(sessionInfoService, 'getPreauthInfo').mockImplementation(jest.fn());
1126
+ mockGetPreauthInfo = jest
1127
+ .spyOn(sessionInfoService, 'getPreauthInfo')
1128
+ .mockImplementation(jest.fn());
1085
1129
  }
1086
- const mockPreauthInfoFetch = jest.spyOn(authService, 'fetchPreauthInfoService').mockResolvedValueOnce({
1130
+ const mockPreauthInfoFetch = jest
1131
+ .spyOn(authService, 'fetchPreauthInfoService')
1132
+ .mockResolvedValueOnce({
1087
1133
  ok: true,
1088
1134
  headers: new Headers({ 'content-type': 'application/json' }),
1089
1135
  json: async () => ({
@@ -1118,14 +1164,14 @@ describe('Unit test case for ts embed', () => {
1118
1164
  };
1119
1165
  };
1120
1166
  test('should call InfoSuccess Event on preauth call success', async () => {
1121
- const { mockPreauthInfoFetch, iFrame, } = await setup(true);
1167
+ const { mockPreauthInfoFetch, iFrame } = await setup(true);
1122
1168
  expect(mockPreauthInfoFetch).toHaveBeenCalledTimes(1);
1123
1169
  await (0, test_utils_1.executeAfterWait)(() => {
1124
1170
  expect(mockProcessTrigger).toHaveBeenCalledWith(iFrame, types_1.HostEvent.InfoSuccess, 'http://tshost', expect.objectContaining({ info: expect.any(Object) }), undefined);
1125
1171
  });
1126
1172
  });
1127
1173
  test('should not call InfoSuccess Event if overrideOrgId is true', async () => {
1128
- const { mockGetPreauthInfo, } = await setup(true, 123);
1174
+ const { mockGetPreauthInfo } = await setup(true, 123);
1129
1175
  expect(mockGetPreauthInfo).toHaveBeenCalledTimes(0);
1130
1176
  });
1131
1177
  });
@@ -1158,14 +1204,17 @@ describe('Unit test case for ts embed', () => {
1158
1204
  const isAppEmbedWithPrimaryNavbar = embedType === 'AppEmbed' && showPrimaryNavbar === true;
1159
1205
  const shouldDisableCache = overrideOrgId || disablePreauthCache || isAppEmbedWithPrimaryNavbar;
1160
1206
  if (shouldDisableCache) {
1161
- mockGetPreauthInfo = jest.spyOn(sessionInfoService, 'getPreauthInfo')
1207
+ mockGetPreauthInfo = jest
1208
+ .spyOn(sessionInfoService, 'getPreauthInfo')
1162
1209
  .mockImplementation(jest.fn());
1163
1210
  }
1164
1211
  else {
1165
- mockGetPreauthInfo = jest.spyOn(sessionInfoService, 'getPreauthInfo')
1212
+ mockGetPreauthInfo = jest
1213
+ .spyOn(sessionInfoService, 'getPreauthInfo')
1166
1214
  .mockResolvedValue({ info: { test: 'data' } });
1167
1215
  }
1168
- const mockPreauthInfoFetch = jest.spyOn(authService, 'fetchPreauthInfoService')
1216
+ const mockPreauthInfoFetch = jest
1217
+ .spyOn(authService, 'fetchPreauthInfoService')
1169
1218
  .mockResolvedValueOnce({
1170
1219
  ok: true,
1171
1220
  headers: new Headers({ 'content-type': 'application/json' }),
@@ -1637,8 +1686,8 @@ describe('Unit test case for ts embed', () => {
1637
1686
  },
1638
1687
  });
1639
1688
  await appEmbed.render();
1640
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1641
- + `&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`);
1689
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
1690
+ `&foo=bar&baz=1&bool=true${defaultParamsPost}#/home`);
1642
1691
  });
1643
1692
  it('should set the additional flags correctly on the iframe src from init and view config', async () => {
1644
1693
  (0, index_1.init)({
@@ -1662,8 +1711,8 @@ describe('Unit test case for ts embed', () => {
1662
1711
  },
1663
1712
  });
1664
1713
  await appEmbed.render();
1665
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1666
- + `&foo=bar&foo2=bar2&foo3=false&baz=1&bool=true${defaultParamsPost}#/home`);
1714
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
1715
+ `&foo=bar&foo2=bar2&foo3=false&baz=1&bool=true${defaultParamsPost}#/home`);
1667
1716
  });
1668
1717
  it('Sets the showAlerts param', async () => {
1669
1718
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1674,8 +1723,8 @@ describe('Unit test case for ts embed', () => {
1674
1723
  showAlerts: true,
1675
1724
  });
1676
1725
  await appEmbed.render();
1677
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1678
- + `&showAlerts=true${defaultParamsPost}#/home`);
1726
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
1727
+ `&showAlerts=true${defaultParamsPost}#/home`);
1679
1728
  });
1680
1729
  it('Sets the locale param', async () => {
1681
1730
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1686,8 +1735,8 @@ describe('Unit test case for ts embed', () => {
1686
1735
  locale: 'ja-JP',
1687
1736
  });
1688
1737
  await appEmbed.render();
1689
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1690
- + `&locale=ja-JP${defaultParamsPost}#/home`);
1738
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
1739
+ `&locale=ja-JP${defaultParamsPost}#/home`);
1691
1740
  });
1692
1741
  it('Sets both params when enableLinkOverridesV2 is set', async () => {
1693
1742
  const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
@@ -1701,7 +1750,37 @@ describe('Unit test case for ts embed', () => {
1701
1750
  await liveboardEmbed.render();
1702
1751
  (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&${test_utils_1.defaultParamsForPinboardEmbed}&enableLinkOverridesV2=true&linkOverride=true${defaultParamsPost}#/embed/viz/test-lb`);
1703
1752
  });
1704
- it('Sets only linkOverride when enableLinkOverridesV2 is not set', async () => {
1753
+ it('Auto-upgrades V1 linkOverride to V2 (sends both flags)', async () => {
1754
+ const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
1755
+ frameParams: {
1756
+ width: '100%',
1757
+ height: '100%',
1758
+ },
1759
+ liveboardId: 'test-lb',
1760
+ linkOverride: true,
1761
+ });
1762
+ await liveboardEmbed.render();
1763
+ const src = (0, test_utils_1.getIFrameSrc)();
1764
+ expect(src).toContain('linkOverride=true');
1765
+ expect(src).toContain('enableLinkOverridesV2=true');
1766
+ });
1767
+ it('Auto-disables V2 link overrides when disableRedirectionLinksInNewTab is true', async () => {
1768
+ const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
1769
+ frameParams: {
1770
+ width: '100%',
1771
+ height: '100%',
1772
+ },
1773
+ liveboardId: 'test-lb',
1774
+ enableLinkOverridesV2: true,
1775
+ disableRedirectionLinksInNewTab: true,
1776
+ });
1777
+ await liveboardEmbed.render();
1778
+ const src = (0, test_utils_1.getIFrameSrc)();
1779
+ expect(src).not.toContain('enableLinkOverridesV2=true');
1780
+ expect(src).not.toContain('linkOverride=true');
1781
+ expect(src).toContain('disableRedirectionLinksInNewTab=true');
1782
+ });
1783
+ it('Auto-disables V1 link override when disableRedirectionLinksInNewTab is true', async () => {
1705
1784
  const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
1706
1785
  frameParams: {
1707
1786
  width: '100%',
@@ -1709,9 +1788,12 @@ describe('Unit test case for ts embed', () => {
1709
1788
  },
1710
1789
  liveboardId: 'test-lb',
1711
1790
  linkOverride: true,
1791
+ disableRedirectionLinksInNewTab: true,
1712
1792
  });
1713
1793
  await liveboardEmbed.render();
1714
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&${test_utils_1.defaultParamsForPinboardEmbed}&linkOverride=true${defaultParamsPost}#/embed/viz/test-lb`);
1794
+ const src = (0, test_utils_1.getIFrameSrc)();
1795
+ expect(src).not.toContain('linkOverride=true');
1796
+ expect(src).toContain('disableRedirectionLinksInNewTab=true');
1715
1797
  });
1716
1798
  it('Sets the iconSprite url', async () => {
1717
1799
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1724,8 +1806,8 @@ describe('Unit test case for ts embed', () => {
1724
1806
  },
1725
1807
  });
1726
1808
  await appEmbed.render();
1727
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1728
- + `&iconSprite=iconSprite.com${defaultParamsPost}#/home`);
1809
+ (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}` +
1810
+ `&iconSprite=iconSprite.com${defaultParamsPost}#/home`);
1729
1811
  });
1730
1812
  it('inserts as sibling of root node if configured', async () => {
1731
1813
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1958,22 +2040,26 @@ describe('Unit test case for ts embed', () => {
1958
2040
  tsEmbedDiv.style.width = '100px';
1959
2041
  tsEmbedDiv.style.height = '100px';
1960
2042
  let resizeObserverCb;
1961
- window.ResizeObserver = window.ResizeObserver
1962
- || jest.fn().mockImplementation((resizeObserverCbParam) => {
1963
- resizeObserverCb = resizeObserverCbParam;
1964
- return {
1965
- disconnect: jest.fn(),
1966
- observe: jest.fn(),
1967
- unobserve: jest.fn(),
1968
- };
1969
- });
2043
+ window.ResizeObserver =
2044
+ window.ResizeObserver ||
2045
+ jest.fn().mockImplementation((resizeObserverCbParam) => {
2046
+ resizeObserverCb = resizeObserverCbParam;
2047
+ return {
2048
+ disconnect: jest.fn(),
2049
+ observe: jest.fn(),
2050
+ unobserve: jest.fn(),
2051
+ };
2052
+ });
1970
2053
  // show preRender
1971
2054
  const warnSpy = jest.spyOn(logger_1.logger, 'warn');
1972
2055
  libEmbed.showPreRender();
1973
2056
  expect(warnSpy).toHaveBeenCalledTimes(1);
2057
+ // The ResizeObserver now tracks the placeholder inside this.el,
2058
+ // not this.el itself, so pass it as the target.
2059
+ const preRenderPlaceholder = tsEmbedDiv.firstElementChild;
1974
2060
  resizeObserverCb([
1975
2061
  {
1976
- target: tsEmbedDiv,
2062
+ target: preRenderPlaceholder,
1977
2063
  contentRect: { height: 297, width: 987 },
1978
2064
  },
1979
2065
  ]);
@@ -2024,12 +2110,13 @@ describe('Unit test case for ts embed', () => {
2024
2110
  });
2025
2111
  it('should set overflow:hidden when hidePreRender and remove when showPreRender', async () => {
2026
2112
  (0, test_utils_1.createRootEleForEmbed)();
2027
- window.ResizeObserver = window.ResizeObserver
2028
- || jest.fn().mockImplementation(() => ({
2029
- disconnect: jest.fn(),
2030
- observe: jest.fn(),
2031
- unobserve: jest.fn(),
2032
- }));
2113
+ window.ResizeObserver =
2114
+ window.ResizeObserver ||
2115
+ jest.fn().mockImplementation(() => ({
2116
+ disconnect: jest.fn(),
2117
+ observe: jest.fn(),
2118
+ unobserve: jest.fn(),
2119
+ }));
2033
2120
  const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2034
2121
  preRenderId: 'overflow-test',
2035
2122
  liveboardId: 'myLiveboardId',
@@ -2055,27 +2142,28 @@ describe('Unit test case for ts embed', () => {
2055
2142
  it('it should connect with another object', async () => {
2056
2143
  (0, test_utils_1.createRootEleForEmbed)();
2057
2144
  (0, test_utils_1.mockMessageChannel)();
2058
- window.ResizeObserver = window.ResizeObserver
2059
- || jest.fn().mockImplementation(() => ({
2060
- disconnect: jest.fn(),
2061
- observe: jest.fn(),
2062
- unobserve: jest.fn(),
2063
- }));
2145
+ window.ResizeObserver =
2146
+ window.ResizeObserver ||
2147
+ jest.fn().mockImplementation(() => ({
2148
+ disconnect: jest.fn(),
2149
+ observe: jest.fn(),
2150
+ unobserve: jest.fn(),
2151
+ }));
2064
2152
  const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2065
2153
  preRenderId: 'i-am-preRendered',
2066
2154
  liveboardId: 'myLiveboardId',
2067
2155
  });
2068
2156
  libEmbed.preRender();
2069
2157
  await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
2070
- const warnSpy = jest.spyOn(logger_1.logger, 'warn');
2071
2158
  const newEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2072
2159
  preRenderId: 'i-am-preRendered',
2073
2160
  liveboardId: 'awdawda',
2074
2161
  hiddenActions: [types_1.Action.AddFilter],
2075
2162
  frameParams: { height: 90 },
2076
2163
  });
2077
- newEmbed.showPreRender();
2078
- expect(warnSpy).toHaveBeenCalledTimes(2);
2164
+ await newEmbed.showPreRender();
2165
+ // Verify newEmbed successfully connected to the existing preRender
2166
+ expect(newEmbed.isPreRenderConnected()).toBe(true);
2079
2167
  });
2080
2168
  it('showPreRender should not preRender if not available', async () => {
2081
2169
  (0, test_utils_1.createRootEleForEmbed)();
@@ -2226,7 +2314,10 @@ describe('Unit test case for ts embed', () => {
2226
2314
  document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
2227
2315
  });
2228
2316
  test('Pre-render should wait for init to complete', async () => {
2229
- const lib = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), { preRenderId: 'test', liveboardId: 'test' });
2317
+ const lib = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
2318
+ preRenderId: 'test',
2319
+ liveboardId: 'test',
2320
+ });
2230
2321
  lib.preRender();
2231
2322
  await (0, test_utils_1.executeAfterWait)(() => {
2232
2323
  expect(errorSpy).toHaveBeenCalledWith(errors_1.ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
@@ -2456,7 +2547,11 @@ describe('Unit test case for ts embed', () => {
2456
2547
  expect(authToken.getAuthenticationToken).toHaveBeenCalledWith(expect.any(Object), true);
2457
2548
  // Check that logger.error was called with the token refresh
2458
2549
  // error
2459
- const errorCalls = logger_1.logger.error.mock.calls.filter((call) => { var _a, _b; return ((_a = call[0]) === null || _a === void 0 ? void 0 : _a.includes(errors_1.ERROR_MESSAGE.INVALID_TOKEN_ERROR)) && ((_b = call[0]) === null || _b === void 0 ? void 0 : _b.includes('Token fetch failed')); });
2550
+ const errorCalls = logger_1.logger.error.mock.calls.filter((call) => {
2551
+ var _a, _b;
2552
+ return ((_a = call[0]) === null || _a === void 0 ? void 0 : _a.includes(errors_1.ERROR_MESSAGE.INVALID_TOKEN_ERROR)) &&
2553
+ ((_b = call[0]) === null || _b === void 0 ? void 0 : _b.includes('Token fetch failed'));
2554
+ });
2460
2555
  expect(errorCalls.length).toBeGreaterThan(0);
2461
2556
  expect(processData.processAuthFailure).toHaveBeenCalledWith(error, expect.any(Element));
2462
2557
  expect(mockPort.postMessage).not.toHaveBeenCalled();
@@ -2618,8 +2713,8 @@ describe('Unit test case for ts embed', () => {
2618
2713
  test('should return getPreRenderObj and log if same object', () => {
2619
2714
  const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2620
2715
  const loggerSpy = jest.spyOn(logger_1.logger, 'info');
2621
- // Mock insertedDomEl to have the embed object
2622
- searchEmbed.insertedDomEl = {
2716
+ // getPreRenderObj reads the embed reference from preRenderWrapper
2717
+ searchEmbed.preRenderWrapper = {
2623
2718
  [searchEmbed['embedNodeKey']]: searchEmbed,
2624
2719
  };
2625
2720
  const result = searchEmbed['getPreRenderObj']();
@@ -2668,7 +2763,8 @@ describe('Unit test case for ts embed', () => {
2668
2763
  test('should return context when embed container is already loaded', async () => {
2669
2764
  const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2670
2765
  searchEmbed.isEmbedContainerLoaded = true;
2671
- const triggerSpy = jest.spyOn(searchEmbed, 'trigger')
2766
+ const triggerSpy = jest
2767
+ .spyOn(searchEmbed, 'trigger')
2672
2768
  .mockResolvedValue(mockContext);
2673
2769
  const context = await searchEmbed.getCurrentContext();
2674
2770
  expect(context).toEqual(mockContext);
@@ -2677,7 +2773,8 @@ describe('Unit test case for ts embed', () => {
2677
2773
  test('should wait for embed container to load before returning context', async () => {
2678
2774
  const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2679
2775
  searchEmbed.isEmbedContainerLoaded = false;
2680
- const triggerSpy = jest.spyOn(searchEmbed, 'trigger')
2776
+ const triggerSpy = jest
2777
+ .spyOn(searchEmbed, 'trigger')
2681
2778
  .mockResolvedValue(mockContext);
2682
2779
  const contextPromise = searchEmbed.getCurrentContext();
2683
2780
  // Context should not be resolved yet
@@ -2863,9 +2960,11 @@ describe('Unit test case for ts embed', () => {
2863
2960
  });
2864
2961
  await appEmbed.render();
2865
2962
  jest.spyOn(appEmbed, 'trigger').mockRejectedValue(new Error('trigger failed'));
2866
- const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild').mockImplementation(() => (0, test_utils_1.getRootEl)());
2963
+ const removeChildSpy = jest
2964
+ .spyOn(Node.prototype, 'removeChild')
2965
+ .mockImplementation(() => (0, test_utils_1.getRootEl)());
2867
2966
  appEmbed.destroy();
2868
- await new Promise(resolve => setTimeout(resolve, 50));
2967
+ await new Promise((resolve) => setTimeout(resolve, 50));
2869
2968
  expect(removeChildSpy).toHaveBeenCalled();
2870
2969
  embedConfig.setEmbedConfig(originalEmbedConfig);
2871
2970
  });
@@ -2890,7 +2989,9 @@ describe('Unit test case for ts embed', () => {
2890
2989
  });
2891
2990
  await appEmbed.render();
2892
2991
  const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockResolvedValue(null);
2893
- const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild').mockImplementation(() => (0, test_utils_1.getRootEl)());
2992
+ const removeChildSpy = jest
2993
+ .spyOn(Node.prototype, 'removeChild')
2994
+ .mockImplementation(() => (0, test_utils_1.getRootEl)());
2894
2995
  appEmbed.destroy();
2895
2996
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2896
2997
  expect(removeChildSpy).toHaveBeenCalled();
@@ -2909,12 +3010,14 @@ describe('Unit test case for ts embed', () => {
2909
3010
  });
2910
3011
  await appEmbed.render();
2911
3012
  const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockResolvedValue(null);
2912
- const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild').mockImplementation(() => (0, test_utils_1.getRootEl)());
3013
+ const removeChildSpy = jest
3014
+ .spyOn(Node.prototype, 'removeChild')
3015
+ .mockImplementation(() => (0, test_utils_1.getRootEl)());
2913
3016
  appEmbed.destroy();
2914
3017
  // Should be called immediately when config is enabled
2915
3018
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2916
3019
  // Wait for the timeout to complete
2917
- await new Promise(resolve => setTimeout(resolve, 1100));
3020
+ await new Promise((resolve) => setTimeout(resolve, 1100));
2918
3021
  expect(removeChildSpy).toHaveBeenCalled();
2919
3022
  });
2920
3023
  it('should handle Promise.race with successful cleanup completion', async () => {
@@ -2931,11 +3034,15 @@ describe('Unit test case for ts embed', () => {
2931
3034
  });
2932
3035
  await appEmbed.render();
2933
3036
  // Mock trigger to resolve quickly (before timeout)
2934
- const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockImplementation(() => new Promise(resolve => setTimeout(() => resolve(null), 100)));
2935
- const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild').mockImplementation(() => (0, test_utils_1.getRootEl)());
3037
+ const triggerSpy = jest
3038
+ .spyOn(appEmbed, 'trigger')
3039
+ .mockImplementation(() => new Promise((resolve) => setTimeout(() => resolve(null), 100)));
3040
+ const removeChildSpy = jest
3041
+ .spyOn(Node.prototype, 'removeChild')
3042
+ .mockImplementation(() => (0, test_utils_1.getRootEl)());
2936
3043
  appEmbed.destroy();
2937
3044
  // Wait for the trigger to complete
2938
- await new Promise(resolve => setTimeout(resolve, 200));
3045
+ await new Promise((resolve) => setTimeout(resolve, 200));
2939
3046
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2940
3047
  expect(removeChildSpy).toHaveBeenCalled();
2941
3048
  });
@@ -2953,11 +3060,15 @@ describe('Unit test case for ts embed', () => {
2953
3060
  });
2954
3061
  await appEmbed.render();
2955
3062
  // Mock trigger to take longer than timeout
2956
- const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockImplementation(() => new Promise(resolve => setTimeout(() => resolve(null), 500)));
2957
- const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild').mockImplementation(() => (0, test_utils_1.getRootEl)());
3063
+ const triggerSpy = jest
3064
+ .spyOn(appEmbed, 'trigger')
3065
+ .mockImplementation(() => new Promise((resolve) => setTimeout(() => resolve(null), 500)));
3066
+ const removeChildSpy = jest
3067
+ .spyOn(Node.prototype, 'removeChild')
3068
+ .mockImplementation(() => (0, test_utils_1.getRootEl)());
2958
3069
  appEmbed.destroy();
2959
3070
  // Wait for the timeout to complete
2960
- await new Promise(resolve => setTimeout(resolve, 200));
3071
+ await new Promise((resolve) => setTimeout(resolve, 200));
2961
3072
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2962
3073
  expect(removeChildSpy).toHaveBeenCalled();
2963
3074
  });
@@ -2985,11 +3096,11 @@ describe('Unit test case for ts embed', () => {
2985
3096
  body: JSON.stringify({
2986
3097
  variables: {
2987
3098
  session: { sessionId: 'session-123' },
2988
- contextBookId: 'viz-456'
2989
- }
2990
- })
2991
- }
2992
- })
3099
+ contextBookId: 'viz-456',
3100
+ },
3101
+ }),
3102
+ },
3103
+ }),
2993
3104
  };
2994
3105
  const mockPort = {
2995
3106
  postMessage: jest.fn(),
@@ -3020,8 +3131,8 @@ describe('Unit test case for ts embed', () => {
3020
3131
  type: index_1.EmbedEvent.ApiIntercept,
3021
3132
  data: JSON.stringify({
3022
3133
  input: '/prism/?op=GetChartWithData',
3023
- init: {}
3024
- })
3134
+ init: {},
3135
+ }),
3025
3136
  };
3026
3137
  const mockPort = {
3027
3138
  postMessage: jest.fn(),
@@ -3053,8 +3164,8 @@ describe('Unit test case for ts embed', () => {
3053
3164
  type: index_1.EmbedEvent.ApiIntercept,
3054
3165
  data: JSON.stringify({
3055
3166
  input: '/prism/?op=GetChartWithData',
3056
- init: {}
3057
- })
3167
+ init: {},
3168
+ }),
3058
3169
  };
3059
3170
  const mockPort = {
3060
3171
  postMessage: jest.fn(),
@@ -3071,7 +3182,7 @@ describe('Unit test case for ts embed', () => {
3071
3182
  // handleInterceptEvent
3072
3183
  const result = await capturedGetUnsavedAnswerTml({
3073
3184
  sessionId: 'session-123',
3074
- vizId: 'viz-456'
3185
+ vizId: 'viz-456',
3075
3186
  });
3076
3187
  expect(mockProcessTrigger).toHaveBeenCalled();
3077
3188
  const callArgs = mockProcessTrigger.mock.calls[0];
@@ -3081,8 +3192,8 @@ describe('Unit test case for ts embed', () => {
3081
3192
  type: 'getUnsavedAnswerTML',
3082
3193
  parameters: {
3083
3194
  sessionId: 'session-123',
3084
- vizId: 'viz-456'
3085
- }
3195
+ vizId: 'viz-456',
3196
+ },
3086
3197
  });
3087
3198
  expect(result).toEqual(mockTmlResponse);
3088
3199
  });
@@ -3099,8 +3210,8 @@ describe('Unit test case for ts embed', () => {
3099
3210
  type: index_1.EmbedEvent.ApiIntercept,
3100
3211
  data: JSON.stringify({
3101
3212
  input: '/api/test',
3102
- init: {}
3103
- })
3213
+ init: {},
3214
+ }),
3104
3215
  };
3105
3216
  const mockPort = {
3106
3217
  postMessage: jest.fn(),
@@ -3124,8 +3235,8 @@ describe('Unit test case for ts embed', () => {
3124
3235
  type: index_1.EmbedEvent.ApiIntercept,
3125
3236
  data: JSON.stringify({
3126
3237
  input: '/prism/?op=GetChartWithData',
3127
- init: {}
3128
- })
3238
+ init: {},
3239
+ }),
3129
3240
  };
3130
3241
  const mockPort = {
3131
3242
  postMessage: jest.fn(),
@@ -3166,15 +3277,15 @@ describe('Unit test case for ts embed', () => {
3166
3277
  type: index_1.EmbedEvent.ApiIntercept,
3167
3278
  data: JSON.stringify({
3168
3279
  input: '/prism/?op=GetChartWithData',
3169
- init: {}
3170
- })
3280
+ init: {},
3281
+ }),
3171
3282
  };
3172
3283
  const mockEventData2 = {
3173
3284
  type: index_1.EmbedEvent.ApiIntercept,
3174
3285
  data: JSON.stringify({
3175
3286
  input: '/prism/?op=LoadContextBook',
3176
- init: {}
3177
- })
3287
+ init: {},
3288
+ }),
3178
3289
  };
3179
3290
  const mockPort = {
3180
3291
  postMessage: jest.fn(),
@@ -3203,8 +3314,8 @@ describe('Unit test case for ts embed', () => {
3203
3314
  type: index_1.EmbedEvent.ApiIntercept,
3204
3315
  data: JSON.stringify({
3205
3316
  input: '/prism/?op=GetChartWithData',
3206
- init: {}
3207
- })
3317
+ init: {},
3318
+ }),
3208
3319
  };
3209
3320
  const mockPort = {
3210
3321
  postMessage: jest.fn(),
@@ -3235,8 +3346,8 @@ describe('Unit test case for ts embed', () => {
3235
3346
  type: index_1.EmbedEvent.ApiIntercept,
3236
3347
  data: JSON.stringify({
3237
3348
  input: '/prism/?op=GetChartWithData',
3238
- init: {}
3239
- })
3349
+ init: {},
3350
+ }),
3240
3351
  };
3241
3352
  const mockPort = {
3242
3353
  postMessage: jest.fn(),
@@ -3249,7 +3360,7 @@ describe('Unit test case for ts embed', () => {
3249
3360
  expect(capturedGetUnsavedAnswerTml).toBeDefined();
3250
3361
  const result = await capturedGetUnsavedAnswerTml({
3251
3362
  sessionId: 'session-123',
3252
- vizId: 'viz-456'
3363
+ vizId: 'viz-456',
3253
3364
  });
3254
3365
  expect(result).toBeUndefined();
3255
3366
  });
@@ -3264,8 +3375,8 @@ describe('Unit test case for ts embed', () => {
3264
3375
  type: index_1.EmbedEvent.ApiIntercept,
3265
3376
  data: JSON.stringify({
3266
3377
  input: '/prism/?op=LoadContextBook',
3267
- init: {}
3268
- })
3378
+ init: {},
3379
+ }),
3269
3380
  };
3270
3381
  const mockPort = {
3271
3382
  postMessage: jest.fn(),
@@ -3499,12 +3610,13 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3499
3610
  const setupPreRenderTest = async (preRenderId, initialConfig) => {
3500
3611
  (0, test_utils_1.createRootEleForEmbed)();
3501
3612
  (0, test_utils_1.mockMessageChannel)();
3502
- window.ResizeObserver = window.ResizeObserver
3503
- || jest.fn().mockImplementation(() => ({
3504
- disconnect: jest.fn(),
3505
- observe: jest.fn(),
3506
- unobserve: jest.fn(),
3507
- }));
3613
+ window.ResizeObserver =
3614
+ window.ResizeObserver ||
3615
+ jest.fn().mockImplementation(() => ({
3616
+ disconnect: jest.fn(),
3617
+ observe: jest.fn(),
3618
+ unobserve: jest.fn(),
3619
+ }));
3508
3620
  const embed1 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
3509
3621
  preRenderId,
3510
3622
  ...initialConfig,
@@ -3655,7 +3767,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3655
3767
  authType: index_1.AuthType.None,
3656
3768
  });
3657
3769
  });
3658
- // Matches the structure produced by createValidationError / embedErrorDetails
3770
+ // Matches the structure produced by createValidationError /
3771
+ // embedErrorDetails
3659
3772
  const makeNestedValidationData = (message = 'invalid payload') => ({
3660
3773
  type: index_1.EmbedEvent.Error,
3661
3774
  data: {
@@ -3665,7 +3778,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3665
3778
  error: message,
3666
3779
  },
3667
3780
  });
3668
- // Matches the flat structure where errorType sits at the top level of data
3781
+ // Matches the flat structure where errorType sits at the top level of
3782
+ // data
3669
3783
  const makeFlatValidationData = (message = 'invalid payload') => ({
3670
3784
  errorType: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3671
3785
  message,
@@ -3706,14 +3820,20 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3706
3820
  });
3707
3821
  test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is undefined', () => {
3708
3822
  const errorHandler = jest.fn();
3709
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: undefined });
3823
+ const embed = makeEmbed({
3824
+ useHostEventsV2: true,
3825
+ shouldBypassPayloadValidation: undefined,
3826
+ });
3710
3827
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3711
3828
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3712
3829
  expect(errorHandler).toHaveBeenCalled();
3713
3830
  });
3714
3831
  test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is false', () => {
3715
3832
  const errorHandler = jest.fn();
3716
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3833
+ const embed = makeEmbed({
3834
+ useHostEventsV2: true,
3835
+ shouldBypassPayloadValidation: false,
3836
+ });
3717
3837
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3718
3838
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3719
3839
  expect(errorHandler).toHaveBeenCalled();
@@ -3721,7 +3841,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3721
3841
  test('skips Error event when useHostEventsV2 is false regardless of shouldBypassPayloadValidation', () => {
3722
3842
  jest.spyOn(logger_1.logger, 'warn');
3723
3843
  const errorHandler = jest.fn();
3724
- const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: undefined });
3844
+ const embed = makeEmbed({
3845
+ useHostEventsV2: false,
3846
+ shouldBypassPayloadValidation: undefined,
3847
+ });
3725
3848
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3726
3849
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3727
3850
  expect(errorHandler).not.toHaveBeenCalled();
@@ -3737,7 +3860,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3737
3860
  test('skips Error event when useHostEventsV2 is false and shouldBypassPayloadValidation is true', () => {
3738
3861
  jest.spyOn(logger_1.logger, 'warn');
3739
3862
  const errorHandler = jest.fn();
3740
- const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: true });
3863
+ const embed = makeEmbed({
3864
+ useHostEventsV2: false,
3865
+ shouldBypassPayloadValidation: true,
3866
+ });
3741
3867
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3742
3868
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3743
3869
  expect(errorHandler).not.toHaveBeenCalled();
@@ -3762,14 +3888,20 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3762
3888
  });
3763
3889
  test('delivers Error event to EmbedEvent.ALL handler when not skipped', () => {
3764
3890
  const allHandler = jest.fn();
3765
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3891
+ const embed = makeEmbed({
3892
+ useHostEventsV2: true,
3893
+ shouldBypassPayloadValidation: false,
3894
+ });
3766
3895
  embed.on(index_1.EmbedEvent.ALL, allHandler);
3767
3896
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3768
3897
  expect(allHandler).toHaveBeenCalled();
3769
3898
  });
3770
3899
  test('does not skip non-Error events even with HOST_EVENT_VALIDATION error code', () => {
3771
3900
  const customActionHandler = jest.fn();
3772
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3901
+ const embed = makeEmbed({
3902
+ useHostEventsV2: true,
3903
+ shouldBypassPayloadValidation: false,
3904
+ });
3773
3905
  embed.on(index_1.EmbedEvent.CustomAction, customActionHandler);
3774
3906
  embed.executeCallbacks(index_1.EmbedEvent.CustomAction, {
3775
3907
  data: { code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION },
@@ -3778,7 +3910,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3778
3910
  });
3779
3911
  test('does not skip Error events with unrelated error codes', () => {
3780
3912
  const errorHandler = jest.fn();
3781
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3913
+ const embed = makeEmbed({
3914
+ useHostEventsV2: true,
3915
+ shouldBypassPayloadValidation: false,
3916
+ });
3782
3917
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3783
3918
  embed.executeCallbacks(index_1.EmbedEvent.Error, {
3784
3919
  errorType: 'SOME_OTHER_ERROR',
@@ -3787,5 +3922,145 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3787
3922
  expect(errorHandler).toHaveBeenCalled();
3788
3923
  });
3789
3924
  });
3925
+ describe('constructor init-path branching (SCAL-315058)', () => {
3926
+ beforeEach(() => {
3927
+ (0, index_1.init)({
3928
+ thoughtSpotHost: 'tshost',
3929
+ authType: index_1.AuthType.None,
3930
+ });
3931
+ });
3932
+ it('sets hostElement from domSelector', () => {
3933
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3934
+ expect(embed.hostElement).toBe((0, test_utils_1.getRootEl)());
3935
+ });
3936
+ it('skips isReadyForRenderPromise when init already completed', () => {
3937
+ jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(true);
3938
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3939
+ expect(embed.shouldWaitForRenderPromise).toBe(false);
3940
+ expect(embed.isReadyForRenderPromise).toBeUndefined();
3941
+ });
3942
+ it('sets isReadyForRenderPromise when init not yet completed', () => {
3943
+ jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
3944
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3945
+ expect(embed.shouldWaitForRenderPromise).toBe(true);
3946
+ expect(embed.isReadyForRenderPromise).toBeInstanceOf(Promise);
3947
+ });
3948
+ it('afterInit runs synchronously when init already completed', () => {
3949
+ jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(true);
3950
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3951
+ // thoughtSpotHost is set by afterInit;
3952
+ // must be non-empty after constructor
3953
+ expect(embed.thoughtSpotHost).toBeTruthy();
3954
+ });
3955
+ it('does not set isReadyForRenderPromise when shouldWaitForRenderPromise is false', () => {
3956
+ jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(true);
3957
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3958
+ expect(embed.shouldWaitForRenderPromise).toBe(false);
3959
+ // isReadyForRenderPromise must be undefined
3960
+ // so no unnecessary await occurs
3961
+ expect(embed.isReadyForRenderPromise).toBeUndefined();
3962
+ });
3963
+ it('shouldWaitForRenderPromise flips to false after promise settles', async () => {
3964
+ jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
3965
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3966
+ expect(embed.shouldWaitForRenderPromise).toBe(true);
3967
+ await embed.isReadyForRenderPromise;
3968
+ expect(embed.shouldWaitForRenderPromise).toBe(false);
3969
+ });
3970
+ it('calls throwInitError when getInitPromise rejects', async () => {
3971
+ jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
3972
+ jest.spyOn(baseInstance, 'getInitPromise').mockReturnValue(Promise.reject(new Error('init failed')));
3973
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3974
+ const throwInitErrorSpy = jest.spyOn(embed, 'throwInitError');
3975
+ await embed.isReadyForRenderPromise;
3976
+ expect(throwInitErrorSpy).toHaveBeenCalled();
3977
+ });
3978
+ it('shouldWaitForRenderPromise flips to false even when getInitPromise rejects', async () => {
3979
+ jest.spyOn(baseInstance, 'getIsInitCompleted').mockReturnValue(false);
3980
+ jest.spyOn(baseInstance, 'getInitPromise').mockReturnValue(Promise.reject(new Error('init failed')));
3981
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3982
+ await embed.isReadyForRenderPromise;
3983
+ expect(embed.shouldWaitForRenderPromise).toBe(false);
3984
+ });
3985
+ });
3986
+ describe('preRender ID object includes placeHolder (SCAL-315058)', () => {
3987
+ beforeAll(() => {
3988
+ (0, index_1.init)({
3989
+ thoughtSpotHost: 'tshost',
3990
+ authType: index_1.AuthType.None,
3991
+ });
3992
+ });
3993
+ it('getPreRenderIds returns placeHolder key', () => {
3994
+ (0, test_utils_1.createRootEleForEmbed)();
3995
+ const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
3996
+ preRenderId: 'ph-test',
3997
+ liveboardId: 'lb-id',
3998
+ });
3999
+ const ids = embed.getPreRenderIds();
4000
+ expect(ids.placeHolder).toBe('tsEmbed-pre-render-placeholder-ph-test');
4001
+ });
4002
+ });
4003
+ describe('isPreRenderConnected logic (SCAL-315058)', () => {
4004
+ beforeAll(() => {
4005
+ (0, index_1.init)({
4006
+ thoughtSpotHost: 'tshost',
4007
+ authType: index_1.AuthType.None,
4008
+ });
4009
+ });
4010
+ it('returns false when preRenderWrapper is absent', () => {
4011
+ (0, test_utils_1.createRootEleForEmbed)();
4012
+ const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4013
+ preRenderId: 'conn-test',
4014
+ liveboardId: 'lb-id',
4015
+ });
4016
+ expect(embed.isPreRenderConnected()).toBe(false);
4017
+ });
4018
+ it('returns true once preRenderWrapper and preRenderChild are set', () => {
4019
+ (0, test_utils_1.createRootEleForEmbed)();
4020
+ const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4021
+ preRenderId: 'conn-test-2',
4022
+ liveboardId: 'lb-id',
4023
+ });
4024
+ embed.preRenderWrapper = document.createElement('div');
4025
+ embed.preRenderChild = document.createElement('div');
4026
+ expect(embed.isPreRenderConnected()).toBe(true);
4027
+ });
4028
+ });
4029
+ describe('showPreRender inserts placeholder into hostElement (SCAL-315058)', () => {
4030
+ beforeAll(() => {
4031
+ // Clear spy implementations that may have leaked from prior
4032
+ // describe blocks (e.g. getIsInitCompleted/getInitPromise mocks set
4033
+ // in 'constructor init-path branching' persist across describes
4034
+ // because clearAllMocks only clears call history, not
4035
+ // implementations).
4036
+ jest.restoreAllMocks();
4037
+ jest.spyOn(authInstance, 'postLoginService').mockResolvedValue(undefined);
4038
+ (0, index_1.init)({
4039
+ thoughtSpotHost: 'tshost',
4040
+ authType: index_1.AuthType.None,
4041
+ });
4042
+ window.ResizeObserver = jest.fn().mockImplementation(() => ({
4043
+ disconnect: jest.fn(),
4044
+ observe: jest.fn(),
4045
+ unobserve: jest.fn(),
4046
+ }));
4047
+ });
4048
+ it('showPreRender creates a placeholder element with the correct id', async () => {
4049
+ (0, test_utils_1.createRootEleForEmbed)();
4050
+ const embed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4051
+ preRenderId: 'ph-lifecycle-test',
4052
+ liveboardId: 'lb-id',
4053
+ });
4054
+ await embed.preRender();
4055
+ await (0, test_utils_1.waitFor)(() => !!document.querySelector('#tsEmbed-pre-render-child-ph-lifecycle-test'));
4056
+ await embed.showPreRender();
4057
+ const placeholderEle = embed.getPreRenderPlaceHolderElement();
4058
+ expect(placeholderEle).not.toBeNull();
4059
+ expect(placeholderEle.id).toBe('tsEmbed-pre-render-placeholder-ph-lifecycle-test');
4060
+ // placeholder is attached to a parent element (inside hostElement)
4061
+ expect(placeholderEle.parentElement).not.toBeNull();
4062
+ embed.destroy();
4063
+ });
4064
+ });
3790
4065
  });
3791
4066
  //# sourceMappingURL=ts-embed.spec.js.map