@thoughtspot/visual-embed-sdk 1.48.0 → 1.49.1

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 (217) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/css-variables.d.ts +140 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +62 -1
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +57 -6
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +191 -1
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/auto-frame-renderer.js +7 -2
  11. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  12. package/cjs/src/embed/auto-frame-renderer.spec.js +385 -6
  13. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  14. package/cjs/src/embed/base.d.ts +1 -0
  15. package/cjs/src/embed/base.d.ts.map +1 -1
  16. package/cjs/src/embed/base.js +13 -1
  17. package/cjs/src/embed/base.js.map +1 -1
  18. package/cjs/src/embed/base.spec.js +21 -0
  19. package/cjs/src/embed/base.spec.js.map +1 -1
  20. package/cjs/src/embed/bodyless-conversation.spec.js +86 -0
  21. package/cjs/src/embed/bodyless-conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/conversation.d.ts +16 -1
  23. package/cjs/src/embed/conversation.d.ts.map +1 -1
  24. package/cjs/src/embed/conversation.js +5 -1
  25. package/cjs/src/embed/conversation.js.map +1 -1
  26. package/cjs/src/embed/conversation.spec.js +26 -0
  27. package/cjs/src/embed/conversation.spec.js.map +1 -1
  28. package/cjs/src/embed/liveboard.d.ts +47 -1
  29. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  30. package/cjs/src/embed/liveboard.js +47 -6
  31. package/cjs/src/embed/liveboard.js.map +1 -1
  32. package/cjs/src/embed/liveboard.spec.js +129 -1
  33. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  34. package/cjs/src/embed/spotter-viz-utils.d.ts +85 -0
  35. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -0
  36. package/cjs/src/embed/spotter-viz-utils.js +17 -0
  37. package/cjs/src/embed/spotter-viz-utils.js.map +1 -0
  38. package/cjs/src/embed/spotter-viz-utils.spec.d.ts +2 -0
  39. package/cjs/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
  40. package/cjs/src/embed/spotter-viz-utils.spec.js +31 -0
  41. package/cjs/src/embed/spotter-viz-utils.spec.js.map +1 -0
  42. package/cjs/src/embed/ts-embed.d.ts +58 -38
  43. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  44. package/cjs/src/embed/ts-embed.js +247 -151
  45. package/cjs/src/embed/ts-embed.js.map +1 -1
  46. package/cjs/src/embed/ts-embed.spec.js +369 -123
  47. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  48. package/cjs/src/index.d.ts +2 -1
  49. package/cjs/src/index.d.ts.map +1 -1
  50. package/cjs/src/index.js.map +1 -1
  51. package/cjs/src/mixpanel-service.js +2 -2
  52. package/cjs/src/mixpanel-service.js.map +1 -1
  53. package/cjs/src/react/index.d.ts.map +1 -1
  54. package/cjs/src/react/index.js +3 -0
  55. package/cjs/src/react/index.js.map +1 -1
  56. package/cjs/src/types.d.ts +267 -27
  57. package/cjs/src/types.d.ts.map +1 -1
  58. package/cjs/src/types.js +223 -19
  59. package/cjs/src/types.js.map +1 -1
  60. package/cjs/src/utils/authService/tokenizedAuthService.spec.js +6 -7
  61. package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  62. package/cjs/src/utils/logger.js +2 -1
  63. package/cjs/src/utils/logger.js.map +1 -1
  64. package/cjs/src/utils/logger.spec.d.ts +1 -0
  65. package/cjs/src/utils/logger.spec.d.ts.map +1 -1
  66. package/cjs/src/utils/logger.spec.js +10 -9
  67. package/cjs/src/utils/logger.spec.js.map +1 -1
  68. package/cjs/src/utils/sdk-version.d.ts +2 -0
  69. package/cjs/src/utils/sdk-version.d.ts.map +1 -0
  70. package/cjs/src/utils/sdk-version.js +7 -0
  71. package/cjs/src/utils/sdk-version.js.map +1 -0
  72. package/cjs/src/utils.d.ts +4 -1
  73. package/cjs/src/utils.d.ts.map +1 -1
  74. package/cjs/src/utils.js +107 -10
  75. package/cjs/src/utils.js.map +1 -1
  76. package/cjs/src/utils.spec.js +163 -4
  77. package/cjs/src/utils.spec.js.map +1 -1
  78. package/dist/{index-Ck-r09gt.js → index-B6Rn561t.js} +1 -1
  79. package/dist/src/css-variables.d.ts +140 -0
  80. package/dist/src/css-variables.d.ts.map +1 -1
  81. package/dist/src/embed/app.d.ts +62 -1
  82. package/dist/src/embed/app.d.ts.map +1 -1
  83. package/dist/src/embed/base.d.ts +1 -0
  84. package/dist/src/embed/base.d.ts.map +1 -1
  85. package/dist/src/embed/conversation.d.ts +16 -1
  86. package/dist/src/embed/conversation.d.ts.map +1 -1
  87. package/dist/src/embed/liveboard.d.ts +47 -1
  88. package/dist/src/embed/liveboard.d.ts.map +1 -1
  89. package/dist/src/embed/spotter-viz-utils.d.ts +85 -0
  90. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -0
  91. package/dist/src/embed/spotter-viz-utils.spec.d.ts +2 -0
  92. package/dist/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
  93. package/dist/src/embed/ts-embed.d.ts +58 -38
  94. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  95. package/dist/src/index.d.ts +2 -1
  96. package/dist/src/index.d.ts.map +1 -1
  97. package/dist/src/react/index.d.ts.map +1 -1
  98. package/dist/src/types.d.ts +267 -27
  99. package/dist/src/types.d.ts.map +1 -1
  100. package/dist/src/utils/logger.spec.d.ts +1 -0
  101. package/dist/src/utils/logger.spec.d.ts.map +1 -1
  102. package/dist/src/utils/sdk-version.d.ts +2 -0
  103. package/dist/src/utils/sdk-version.d.ts.map +1 -0
  104. package/dist/src/utils.d.ts +4 -1
  105. package/dist/src/utils.d.ts.map +1 -1
  106. package/dist/tsembed-react.es.js +3710 -3226
  107. package/dist/tsembed-react.js +3360 -2876
  108. package/dist/tsembed.es.js +3715 -3229
  109. package/dist/tsembed.js +3710 -3224
  110. package/dist/visual-embed-sdk-react-full.d.ts +643 -63
  111. package/dist/visual-embed-sdk-react.d.ts +643 -63
  112. package/dist/visual-embed-sdk.d.ts +658 -65
  113. package/lib/package.json +1 -1
  114. package/lib/src/css-variables.d.ts +140 -0
  115. package/lib/src/css-variables.d.ts.map +1 -1
  116. package/lib/src/embed/app.d.ts +62 -1
  117. package/lib/src/embed/app.d.ts.map +1 -1
  118. package/lib/src/embed/app.js +58 -7
  119. package/lib/src/embed/app.js.map +1 -1
  120. package/lib/src/embed/app.spec.js +192 -2
  121. package/lib/src/embed/app.spec.js.map +1 -1
  122. package/lib/src/embed/auto-frame-renderer.js +7 -2
  123. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  124. package/lib/src/embed/auto-frame-renderer.spec.js +387 -8
  125. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  126. package/lib/src/embed/base.d.ts +1 -0
  127. package/lib/src/embed/base.d.ts.map +1 -1
  128. package/lib/src/embed/base.js +11 -0
  129. package/lib/src/embed/base.js.map +1 -1
  130. package/lib/src/embed/base.spec.js +22 -1
  131. package/lib/src/embed/base.spec.js.map +1 -1
  132. package/lib/src/embed/bodyless-conversation.spec.js +86 -0
  133. package/lib/src/embed/bodyless-conversation.spec.js.map +1 -1
  134. package/lib/src/embed/conversation.d.ts +16 -1
  135. package/lib/src/embed/conversation.d.ts.map +1 -1
  136. package/lib/src/embed/conversation.js +5 -1
  137. package/lib/src/embed/conversation.js.map +1 -1
  138. package/lib/src/embed/conversation.spec.js +27 -1
  139. package/lib/src/embed/conversation.spec.js.map +1 -1
  140. package/lib/src/embed/liveboard.d.ts +47 -1
  141. package/lib/src/embed/liveboard.d.ts.map +1 -1
  142. package/lib/src/embed/liveboard.js +48 -7
  143. package/lib/src/embed/liveboard.js.map +1 -1
  144. package/lib/src/embed/liveboard.spec.js +129 -1
  145. package/lib/src/embed/liveboard.spec.js.map +1 -1
  146. package/lib/src/embed/spotter-viz-utils.d.ts +85 -0
  147. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -0
  148. package/lib/src/embed/spotter-viz-utils.js +13 -0
  149. package/lib/src/embed/spotter-viz-utils.js.map +1 -0
  150. package/lib/src/embed/spotter-viz-utils.spec.d.ts +2 -0
  151. package/lib/src/embed/spotter-viz-utils.spec.d.ts.map +1 -0
  152. package/lib/src/embed/spotter-viz-utils.spec.js +29 -0
  153. package/lib/src/embed/spotter-viz-utils.spec.js.map +1 -0
  154. package/lib/src/embed/ts-embed.d.ts +58 -38
  155. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  156. package/lib/src/embed/ts-embed.js +249 -153
  157. package/lib/src/embed/ts-embed.js.map +1 -1
  158. package/lib/src/embed/ts-embed.spec.js +369 -123
  159. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  160. package/lib/src/index.d.ts +2 -1
  161. package/lib/src/index.d.ts.map +1 -1
  162. package/lib/src/index.js.map +1 -1
  163. package/lib/src/mixpanel-service.js +1 -1
  164. package/lib/src/mixpanel-service.js.map +1 -1
  165. package/lib/src/react/index.d.ts.map +1 -1
  166. package/lib/src/react/index.js +3 -0
  167. package/lib/src/react/index.js.map +1 -1
  168. package/lib/src/types.d.ts +267 -27
  169. package/lib/src/types.d.ts.map +1 -1
  170. package/lib/src/types.js +223 -19
  171. package/lib/src/types.js.map +1 -1
  172. package/lib/src/utils/authService/tokenizedAuthService.spec.js +6 -7
  173. package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  174. package/lib/src/utils/logger.js +2 -1
  175. package/lib/src/utils/logger.js.map +1 -1
  176. package/lib/src/utils/logger.spec.d.ts +1 -0
  177. package/lib/src/utils/logger.spec.d.ts.map +1 -1
  178. package/lib/src/utils/logger.spec.js +10 -9
  179. package/lib/src/utils/logger.spec.js.map +1 -1
  180. package/lib/src/utils/sdk-version.d.ts +2 -0
  181. package/lib/src/utils/sdk-version.d.ts.map +1 -0
  182. package/lib/src/utils/sdk-version.js +3 -0
  183. package/lib/src/utils/sdk-version.js.map +1 -0
  184. package/lib/src/utils.d.ts +4 -1
  185. package/lib/src/utils.d.ts.map +1 -1
  186. package/lib/src/utils.js +103 -9
  187. package/lib/src/utils.js.map +1 -1
  188. package/lib/src/utils.spec.js +164 -5
  189. package/lib/src/utils.spec.js.map +1 -1
  190. package/lib/src/visual-embed-sdk.d.ts +658 -65
  191. package/package.json +1 -1
  192. package/src/css-variables.ts +175 -1
  193. package/src/embed/app.spec.ts +247 -3
  194. package/src/embed/app.ts +125 -5
  195. package/src/embed/auto-frame-renderer.spec.ts +457 -58
  196. package/src/embed/auto-frame-renderer.ts +7 -2
  197. package/src/embed/base.spec.ts +25 -1
  198. package/src/embed/base.ts +19 -5
  199. package/src/embed/bodyless-conversation.spec.ts +93 -0
  200. package/src/embed/conversation.spec.ts +34 -0
  201. package/src/embed/conversation.ts +22 -1
  202. package/src/embed/liveboard.spec.ts +149 -1
  203. package/src/embed/liveboard.ts +102 -6
  204. package/src/embed/spotter-viz-utils.spec.ts +30 -0
  205. package/src/embed/spotter-viz-utils.ts +94 -0
  206. package/src/embed/ts-embed.spec.ts +532 -234
  207. package/src/embed/ts-embed.ts +384 -258
  208. package/src/index.ts +3 -0
  209. package/src/mixpanel-service.ts +1 -1
  210. package/src/react/index.tsx +3 -0
  211. package/src/types.ts +284 -23
  212. package/src/utils/authService/tokenizedAuthService.spec.ts +6 -6
  213. package/src/utils/logger.spec.ts +11 -9
  214. package/src/utils/logger.ts +2 -2
  215. package/src/utils/sdk-version.ts +3 -0
  216. package/src/utils.spec.ts +200 -4
  217. package/src/utils.ts +128 -9
@@ -85,7 +85,7 @@ const getMockAppInitPayload = (data) => {
85
85
  interceptUrls: [],
86
86
  shouldBypassPayloadValidation: undefined,
87
87
  useHostEventsV2: undefined,
88
- embedExpiryInAuthToken: true
88
+ embedExpiryInAuthToken: true,
89
89
  };
90
90
  return {
91
91
  type: index_1.EmbedEvent.APP_INIT,
@@ -374,7 +374,10 @@ describe('Unit test case for ts embed', () => {
374
374
  });
375
375
  await (0, test_utils_1.executeAfterWait)(() => {
376
376
  expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
377
- reorderedHomepageModules: [types_1.HomepageModule.MyLibrary, types_1.HomepageModule.Watchlist],
377
+ reorderedHomepageModules: [
378
+ types_1.HomepageModule.MyLibrary,
379
+ types_1.HomepageModule.Watchlist,
380
+ ],
378
381
  }));
379
382
  });
380
383
  });
@@ -520,7 +523,10 @@ describe('Unit test case for ts embed', () => {
520
523
  });
521
524
  await (0, test_utils_1.executeAfterWait)(() => {
522
525
  expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
523
- hiddenHomeLeftNavItems: [types_1.HomeLeftNavItem.Home, types_1.HomeLeftNavItem.MonitorSubscription],
526
+ hiddenHomeLeftNavItems: [
527
+ types_1.HomeLeftNavItem.Home,
528
+ types_1.HomeLeftNavItem.MonitorSubscription,
529
+ ],
524
530
  }));
525
531
  });
526
532
  });
@@ -748,10 +754,8 @@ describe('Unit test case for ts embed', () => {
748
754
  customVariablesForThirdPartyTools: {},
749
755
  }));
750
756
  const customisationContent = mockPort.postMessage.mock.calls[0][0].data.customisations.content;
751
- expect(customisationContent.stringIDsUrl)
752
- .toBe('https://sample-string-ids-url.com');
753
- expect(customisationContent.stringIDs)
754
- .toEqual({
757
+ expect(customisationContent.stringIDsUrl).toBe('https://sample-string-ids-url.com');
758
+ expect(customisationContent.stringIDs).toEqual({
755
759
  'liveboard.header.title': 'Dashboard name',
756
760
  });
757
761
  });
@@ -761,7 +765,10 @@ describe('Unit test case for ts embed', () => {
761
765
  type: index_1.EmbedEvent.APP_INIT,
762
766
  data: {},
763
767
  };
764
- 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
+ });
765
772
  searchEmbed.render();
766
773
  const mockPort = {
767
774
  postMessage: jest.fn(),
@@ -802,16 +809,16 @@ describe('Unit test case for ts embed', () => {
802
809
  name: 'Valid Action',
803
810
  target: types_1.CustomActionTarget.LIVEBOARD,
804
811
  position: types_1.CustomActionsPosition.PRIMARY,
805
- metadataIds: { liveboardIds: ['lb123'] }
812
+ metadataIds: { liveboardIds: ['lb123'] },
806
813
  },
807
814
  {
808
815
  id: 'action2',
809
816
  name: 'Another Valid Action',
810
817
  target: types_1.CustomActionTarget.VIZ,
811
818
  position: types_1.CustomActionsPosition.MENU,
812
- metadataIds: { vizIds: ['viz456'] }
813
- }
814
- ]
819
+ metadataIds: { vizIds: ['viz456'] },
820
+ },
821
+ ],
815
822
  });
816
823
  searchEmbed.render();
817
824
  const mockPort = {
@@ -837,15 +844,15 @@ describe('Unit test case for ts embed', () => {
837
844
  name: 'Another Valid Action',
838
845
  target: types_1.CustomActionTarget.VIZ,
839
846
  position: types_1.CustomActionsPosition.MENU,
840
- metadataIds: { vizIds: ['viz456'] }
847
+ metadataIds: { vizIds: ['viz456'] },
841
848
  },
842
849
  {
843
850
  id: 'action1',
844
851
  name: 'Valid Action',
845
852
  target: types_1.CustomActionTarget.LIVEBOARD,
846
853
  position: types_1.CustomActionsPosition.PRIMARY,
847
- metadataIds: { liveboardIds: ['lb123'] }
848
- }
854
+ metadataIds: { liveboardIds: ['lb123'] },
855
+ },
849
856
  ],
850
857
  customVariablesForThirdPartyTools: {},
851
858
  }));
@@ -858,14 +865,14 @@ describe('Unit test case for ts embed', () => {
858
865
  id: 'action1',
859
866
  name: 'Valid Action',
860
867
  target: types_1.CustomActionTarget.LIVEBOARD,
861
- position: types_1.CustomActionsPosition.PRIMARY
868
+ position: types_1.CustomActionsPosition.PRIMARY,
862
869
  }),
863
870
  expect.objectContaining({
864
871
  id: 'action2',
865
872
  name: 'Another Valid Action',
866
873
  target: types_1.CustomActionTarget.VIZ,
867
- position: types_1.CustomActionsPosition.MENU
868
- })
874
+ position: types_1.CustomActionsPosition.MENU,
875
+ }),
869
876
  ]));
870
877
  // Verify actions are sorted by name (alphabetically)
871
878
  expect(appInitData.customActions[0].name).toBe('Another Valid Action');
@@ -919,7 +926,10 @@ describe('Unit test case for ts embed', () => {
919
926
  type: index_1.EmbedEvent.APP_INIT,
920
927
  data: {},
921
928
  };
922
- 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
+ });
923
933
  searchEmbed.preRender();
924
934
  const mockPort = {
925
935
  postMessage: jest.fn(),
@@ -970,7 +980,10 @@ describe('Unit test case for ts embed', () => {
970
980
  type: index_1.EmbedEvent.AuthExpire,
971
981
  data: {},
972
982
  };
973
- 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
+ });
974
987
  jest.spyOn(baseInstance, 'notifyAuthFailure');
975
988
  searchEmbed.preRender();
976
989
  const loggerSpy = jest.spyOn(logger_1.logger, 'error').mockImplementation(() => { });
@@ -1110,9 +1123,13 @@ describe('Unit test case for ts embed', () => {
1110
1123
  // resetCachedPreauthInfo();
1111
1124
  let mockGetPreauthInfo = null;
1112
1125
  if (overrideOrgId) {
1113
- mockGetPreauthInfo = jest.spyOn(sessionInfoService, 'getPreauthInfo').mockImplementation(jest.fn());
1126
+ mockGetPreauthInfo = jest
1127
+ .spyOn(sessionInfoService, 'getPreauthInfo')
1128
+ .mockImplementation(jest.fn());
1114
1129
  }
1115
- const mockPreauthInfoFetch = jest.spyOn(authService, 'fetchPreauthInfoService').mockResolvedValueOnce({
1130
+ const mockPreauthInfoFetch = jest
1131
+ .spyOn(authService, 'fetchPreauthInfoService')
1132
+ .mockResolvedValueOnce({
1116
1133
  ok: true,
1117
1134
  headers: new Headers({ 'content-type': 'application/json' }),
1118
1135
  json: async () => ({
@@ -1147,14 +1164,14 @@ describe('Unit test case for ts embed', () => {
1147
1164
  };
1148
1165
  };
1149
1166
  test('should call InfoSuccess Event on preauth call success', async () => {
1150
- const { mockPreauthInfoFetch, iFrame, } = await setup(true);
1167
+ const { mockPreauthInfoFetch, iFrame } = await setup(true);
1151
1168
  expect(mockPreauthInfoFetch).toHaveBeenCalledTimes(1);
1152
1169
  await (0, test_utils_1.executeAfterWait)(() => {
1153
1170
  expect(mockProcessTrigger).toHaveBeenCalledWith(iFrame, types_1.HostEvent.InfoSuccess, 'http://tshost', expect.objectContaining({ info: expect.any(Object) }), undefined);
1154
1171
  });
1155
1172
  });
1156
1173
  test('should not call InfoSuccess Event if overrideOrgId is true', async () => {
1157
- const { mockGetPreauthInfo, } = await setup(true, 123);
1174
+ const { mockGetPreauthInfo } = await setup(true, 123);
1158
1175
  expect(mockGetPreauthInfo).toHaveBeenCalledTimes(0);
1159
1176
  });
1160
1177
  });
@@ -1187,14 +1204,17 @@ describe('Unit test case for ts embed', () => {
1187
1204
  const isAppEmbedWithPrimaryNavbar = embedType === 'AppEmbed' && showPrimaryNavbar === true;
1188
1205
  const shouldDisableCache = overrideOrgId || disablePreauthCache || isAppEmbedWithPrimaryNavbar;
1189
1206
  if (shouldDisableCache) {
1190
- mockGetPreauthInfo = jest.spyOn(sessionInfoService, 'getPreauthInfo')
1207
+ mockGetPreauthInfo = jest
1208
+ .spyOn(sessionInfoService, 'getPreauthInfo')
1191
1209
  .mockImplementation(jest.fn());
1192
1210
  }
1193
1211
  else {
1194
- mockGetPreauthInfo = jest.spyOn(sessionInfoService, 'getPreauthInfo')
1212
+ mockGetPreauthInfo = jest
1213
+ .spyOn(sessionInfoService, 'getPreauthInfo')
1195
1214
  .mockResolvedValue({ info: { test: 'data' } });
1196
1215
  }
1197
- const mockPreauthInfoFetch = jest.spyOn(authService, 'fetchPreauthInfoService')
1216
+ const mockPreauthInfoFetch = jest
1217
+ .spyOn(authService, 'fetchPreauthInfoService')
1198
1218
  .mockResolvedValueOnce({
1199
1219
  ok: true,
1200
1220
  headers: new Headers({ 'content-type': 'application/json' }),
@@ -1666,8 +1686,8 @@ describe('Unit test case for ts embed', () => {
1666
1686
  },
1667
1687
  });
1668
1688
  await appEmbed.render();
1669
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1670
- + `&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`);
1671
1691
  });
1672
1692
  it('should set the additional flags correctly on the iframe src from init and view config', async () => {
1673
1693
  (0, index_1.init)({
@@ -1691,8 +1711,8 @@ describe('Unit test case for ts embed', () => {
1691
1711
  },
1692
1712
  });
1693
1713
  await appEmbed.render();
1694
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1695
- + `&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`);
1696
1716
  });
1697
1717
  it('Sets the showAlerts param', async () => {
1698
1718
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1703,8 +1723,8 @@ describe('Unit test case for ts embed', () => {
1703
1723
  showAlerts: true,
1704
1724
  });
1705
1725
  await appEmbed.render();
1706
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1707
- + `&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`);
1708
1728
  });
1709
1729
  it('Sets the locale param', async () => {
1710
1730
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1715,8 +1735,8 @@ describe('Unit test case for ts embed', () => {
1715
1735
  locale: 'ja-JP',
1716
1736
  });
1717
1737
  await appEmbed.render();
1718
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1719
- + `&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`);
1720
1740
  });
1721
1741
  it('Sets both params when enableLinkOverridesV2 is set', async () => {
1722
1742
  const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
@@ -1730,7 +1750,7 @@ describe('Unit test case for ts embed', () => {
1730
1750
  await liveboardEmbed.render();
1731
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`);
1732
1752
  });
1733
- it('Sets only linkOverride when enableLinkOverridesV2 is not set', async () => {
1753
+ it('Auto-upgrades V1 linkOverride to V2 (sends both flags)', async () => {
1734
1754
  const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
1735
1755
  frameParams: {
1736
1756
  width: '100%',
@@ -1740,7 +1760,40 @@ describe('Unit test case for ts embed', () => {
1740
1760
  linkOverride: true,
1741
1761
  });
1742
1762
  await liveboardEmbed.render();
1743
- (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`);
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 () => {
1784
+ const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
1785
+ frameParams: {
1786
+ width: '100%',
1787
+ height: '100%',
1788
+ },
1789
+ liveboardId: 'test-lb',
1790
+ linkOverride: true,
1791
+ disableRedirectionLinksInNewTab: true,
1792
+ });
1793
+ await liveboardEmbed.render();
1794
+ const src = (0, test_utils_1.getIFrameSrc)();
1795
+ expect(src).not.toContain('linkOverride=true');
1796
+ expect(src).toContain('disableRedirectionLinksInNewTab=true');
1744
1797
  });
1745
1798
  it('Sets the iconSprite url', async () => {
1746
1799
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1753,8 +1806,8 @@ describe('Unit test case for ts embed', () => {
1753
1806
  },
1754
1807
  });
1755
1808
  await appEmbed.render();
1756
- (0, test_utils_1.expectUrlMatchesWithParams)((0, test_utils_1.getIFrameSrc)(), `http://${thoughtSpotHost}/?embedApp=true&primaryNavHidden=true&profileAndHelpInNavBarHidden=false&${test_utils_1.defaultParamsForPinboardEmbed}`
1757
- + `&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`);
1758
1811
  });
1759
1812
  it('inserts as sibling of root node if configured', async () => {
1760
1813
  const appEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
@@ -1987,22 +2040,26 @@ describe('Unit test case for ts embed', () => {
1987
2040
  tsEmbedDiv.style.width = '100px';
1988
2041
  tsEmbedDiv.style.height = '100px';
1989
2042
  let resizeObserverCb;
1990
- window.ResizeObserver = window.ResizeObserver
1991
- || jest.fn().mockImplementation((resizeObserverCbParam) => {
1992
- resizeObserverCb = resizeObserverCbParam;
1993
- return {
1994
- disconnect: jest.fn(),
1995
- observe: jest.fn(),
1996
- unobserve: jest.fn(),
1997
- };
1998
- });
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
+ });
1999
2053
  // show preRender
2000
2054
  const warnSpy = jest.spyOn(logger_1.logger, 'warn');
2001
2055
  libEmbed.showPreRender();
2002
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;
2003
2060
  resizeObserverCb([
2004
2061
  {
2005
- target: tsEmbedDiv,
2062
+ target: preRenderPlaceholder,
2006
2063
  contentRect: { height: 297, width: 987 },
2007
2064
  },
2008
2065
  ]);
@@ -2053,12 +2110,13 @@ describe('Unit test case for ts embed', () => {
2053
2110
  });
2054
2111
  it('should set overflow:hidden when hidePreRender and remove when showPreRender', async () => {
2055
2112
  (0, test_utils_1.createRootEleForEmbed)();
2056
- window.ResizeObserver = window.ResizeObserver
2057
- || jest.fn().mockImplementation(() => ({
2058
- disconnect: jest.fn(),
2059
- observe: jest.fn(),
2060
- unobserve: jest.fn(),
2061
- }));
2113
+ window.ResizeObserver =
2114
+ window.ResizeObserver ||
2115
+ jest.fn().mockImplementation(() => ({
2116
+ disconnect: jest.fn(),
2117
+ observe: jest.fn(),
2118
+ unobserve: jest.fn(),
2119
+ }));
2062
2120
  const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2063
2121
  preRenderId: 'overflow-test',
2064
2122
  liveboardId: 'myLiveboardId',
@@ -2084,27 +2142,28 @@ describe('Unit test case for ts embed', () => {
2084
2142
  it('it should connect with another object', async () => {
2085
2143
  (0, test_utils_1.createRootEleForEmbed)();
2086
2144
  (0, test_utils_1.mockMessageChannel)();
2087
- window.ResizeObserver = window.ResizeObserver
2088
- || jest.fn().mockImplementation(() => ({
2089
- disconnect: jest.fn(),
2090
- observe: jest.fn(),
2091
- unobserve: jest.fn(),
2092
- }));
2145
+ window.ResizeObserver =
2146
+ window.ResizeObserver ||
2147
+ jest.fn().mockImplementation(() => ({
2148
+ disconnect: jest.fn(),
2149
+ observe: jest.fn(),
2150
+ unobserve: jest.fn(),
2151
+ }));
2093
2152
  const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2094
2153
  preRenderId: 'i-am-preRendered',
2095
2154
  liveboardId: 'myLiveboardId',
2096
2155
  });
2097
2156
  libEmbed.preRender();
2098
2157
  await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
2099
- const warnSpy = jest.spyOn(logger_1.logger, 'warn');
2100
2158
  const newEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2101
2159
  preRenderId: 'i-am-preRendered',
2102
2160
  liveboardId: 'awdawda',
2103
2161
  hiddenActions: [types_1.Action.AddFilter],
2104
2162
  frameParams: { height: 90 },
2105
2163
  });
2106
- newEmbed.showPreRender();
2107
- expect(warnSpy).toHaveBeenCalledTimes(2);
2164
+ await newEmbed.showPreRender();
2165
+ // Verify newEmbed successfully connected to the existing preRender
2166
+ expect(newEmbed.isPreRenderConnected()).toBe(true);
2108
2167
  });
2109
2168
  it('showPreRender should not preRender if not available', async () => {
2110
2169
  (0, test_utils_1.createRootEleForEmbed)();
@@ -2255,7 +2314,10 @@ describe('Unit test case for ts embed', () => {
2255
2314
  document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
2256
2315
  });
2257
2316
  test('Pre-render should wait for init to complete', async () => {
2258
- 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
+ });
2259
2321
  lib.preRender();
2260
2322
  await (0, test_utils_1.executeAfterWait)(() => {
2261
2323
  expect(errorSpy).toHaveBeenCalledWith(errors_1.ERROR_MESSAGE.RENDER_CALLED_BEFORE_INIT);
@@ -2485,7 +2547,11 @@ describe('Unit test case for ts embed', () => {
2485
2547
  expect(authToken.getAuthenticationToken).toHaveBeenCalledWith(expect.any(Object), true);
2486
2548
  // Check that logger.error was called with the token refresh
2487
2549
  // error
2488
- 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
+ });
2489
2555
  expect(errorCalls.length).toBeGreaterThan(0);
2490
2556
  expect(processData.processAuthFailure).toHaveBeenCalledWith(error, expect.any(Element));
2491
2557
  expect(mockPort.postMessage).not.toHaveBeenCalled();
@@ -2647,8 +2713,8 @@ describe('Unit test case for ts embed', () => {
2647
2713
  test('should return getPreRenderObj and log if same object', () => {
2648
2714
  const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2649
2715
  const loggerSpy = jest.spyOn(logger_1.logger, 'info');
2650
- // Mock insertedDomEl to have the embed object
2651
- searchEmbed.insertedDomEl = {
2716
+ // getPreRenderObj reads the embed reference from preRenderWrapper
2717
+ searchEmbed.preRenderWrapper = {
2652
2718
  [searchEmbed['embedNodeKey']]: searchEmbed,
2653
2719
  };
2654
2720
  const result = searchEmbed['getPreRenderObj']();
@@ -2697,7 +2763,8 @@ describe('Unit test case for ts embed', () => {
2697
2763
  test('should return context when embed container is already loaded', async () => {
2698
2764
  const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2699
2765
  searchEmbed.isEmbedContainerLoaded = true;
2700
- const triggerSpy = jest.spyOn(searchEmbed, 'trigger')
2766
+ const triggerSpy = jest
2767
+ .spyOn(searchEmbed, 'trigger')
2701
2768
  .mockResolvedValue(mockContext);
2702
2769
  const context = await searchEmbed.getCurrentContext();
2703
2770
  expect(context).toEqual(mockContext);
@@ -2706,7 +2773,8 @@ describe('Unit test case for ts embed', () => {
2706
2773
  test('should wait for embed container to load before returning context', async () => {
2707
2774
  const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2708
2775
  searchEmbed.isEmbedContainerLoaded = false;
2709
- const triggerSpy = jest.spyOn(searchEmbed, 'trigger')
2776
+ const triggerSpy = jest
2777
+ .spyOn(searchEmbed, 'trigger')
2710
2778
  .mockResolvedValue(mockContext);
2711
2779
  const contextPromise = searchEmbed.getCurrentContext();
2712
2780
  // Context should not be resolved yet
@@ -2892,9 +2960,11 @@ describe('Unit test case for ts embed', () => {
2892
2960
  });
2893
2961
  await appEmbed.render();
2894
2962
  jest.spyOn(appEmbed, 'trigger').mockRejectedValue(new Error('trigger failed'));
2895
- 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)());
2896
2966
  appEmbed.destroy();
2897
- await new Promise(resolve => setTimeout(resolve, 50));
2967
+ await new Promise((resolve) => setTimeout(resolve, 50));
2898
2968
  expect(removeChildSpy).toHaveBeenCalled();
2899
2969
  embedConfig.setEmbedConfig(originalEmbedConfig);
2900
2970
  });
@@ -2919,7 +2989,9 @@ describe('Unit test case for ts embed', () => {
2919
2989
  });
2920
2990
  await appEmbed.render();
2921
2991
  const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockResolvedValue(null);
2922
- 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)());
2923
2995
  appEmbed.destroy();
2924
2996
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2925
2997
  expect(removeChildSpy).toHaveBeenCalled();
@@ -2938,12 +3010,14 @@ describe('Unit test case for ts embed', () => {
2938
3010
  });
2939
3011
  await appEmbed.render();
2940
3012
  const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockResolvedValue(null);
2941
- 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)());
2942
3016
  appEmbed.destroy();
2943
3017
  // Should be called immediately when config is enabled
2944
3018
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2945
3019
  // Wait for the timeout to complete
2946
- await new Promise(resolve => setTimeout(resolve, 1100));
3020
+ await new Promise((resolve) => setTimeout(resolve, 1100));
2947
3021
  expect(removeChildSpy).toHaveBeenCalled();
2948
3022
  });
2949
3023
  it('should handle Promise.race with successful cleanup completion', async () => {
@@ -2960,11 +3034,15 @@ describe('Unit test case for ts embed', () => {
2960
3034
  });
2961
3035
  await appEmbed.render();
2962
3036
  // Mock trigger to resolve quickly (before timeout)
2963
- const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockImplementation(() => new Promise(resolve => setTimeout(() => resolve(null), 100)));
2964
- 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)());
2965
3043
  appEmbed.destroy();
2966
3044
  // Wait for the trigger to complete
2967
- await new Promise(resolve => setTimeout(resolve, 200));
3045
+ await new Promise((resolve) => setTimeout(resolve, 200));
2968
3046
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2969
3047
  expect(removeChildSpy).toHaveBeenCalled();
2970
3048
  });
@@ -2982,11 +3060,15 @@ describe('Unit test case for ts embed', () => {
2982
3060
  });
2983
3061
  await appEmbed.render();
2984
3062
  // Mock trigger to take longer than timeout
2985
- const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockImplementation(() => new Promise(resolve => setTimeout(() => resolve(null), 500)));
2986
- 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)());
2987
3069
  appEmbed.destroy();
2988
3070
  // Wait for the timeout to complete
2989
- await new Promise(resolve => setTimeout(resolve, 200));
3071
+ await new Promise((resolve) => setTimeout(resolve, 200));
2990
3072
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2991
3073
  expect(removeChildSpy).toHaveBeenCalled();
2992
3074
  });
@@ -3014,11 +3096,11 @@ describe('Unit test case for ts embed', () => {
3014
3096
  body: JSON.stringify({
3015
3097
  variables: {
3016
3098
  session: { sessionId: 'session-123' },
3017
- contextBookId: 'viz-456'
3018
- }
3019
- })
3020
- }
3021
- })
3099
+ contextBookId: 'viz-456',
3100
+ },
3101
+ }),
3102
+ },
3103
+ }),
3022
3104
  };
3023
3105
  const mockPort = {
3024
3106
  postMessage: jest.fn(),
@@ -3049,8 +3131,8 @@ describe('Unit test case for ts embed', () => {
3049
3131
  type: index_1.EmbedEvent.ApiIntercept,
3050
3132
  data: JSON.stringify({
3051
3133
  input: '/prism/?op=GetChartWithData',
3052
- init: {}
3053
- })
3134
+ init: {},
3135
+ }),
3054
3136
  };
3055
3137
  const mockPort = {
3056
3138
  postMessage: jest.fn(),
@@ -3082,8 +3164,8 @@ describe('Unit test case for ts embed', () => {
3082
3164
  type: index_1.EmbedEvent.ApiIntercept,
3083
3165
  data: JSON.stringify({
3084
3166
  input: '/prism/?op=GetChartWithData',
3085
- init: {}
3086
- })
3167
+ init: {},
3168
+ }),
3087
3169
  };
3088
3170
  const mockPort = {
3089
3171
  postMessage: jest.fn(),
@@ -3100,7 +3182,7 @@ describe('Unit test case for ts embed', () => {
3100
3182
  // handleInterceptEvent
3101
3183
  const result = await capturedGetUnsavedAnswerTml({
3102
3184
  sessionId: 'session-123',
3103
- vizId: 'viz-456'
3185
+ vizId: 'viz-456',
3104
3186
  });
3105
3187
  expect(mockProcessTrigger).toHaveBeenCalled();
3106
3188
  const callArgs = mockProcessTrigger.mock.calls[0];
@@ -3110,8 +3192,8 @@ describe('Unit test case for ts embed', () => {
3110
3192
  type: 'getUnsavedAnswerTML',
3111
3193
  parameters: {
3112
3194
  sessionId: 'session-123',
3113
- vizId: 'viz-456'
3114
- }
3195
+ vizId: 'viz-456',
3196
+ },
3115
3197
  });
3116
3198
  expect(result).toEqual(mockTmlResponse);
3117
3199
  });
@@ -3128,8 +3210,8 @@ describe('Unit test case for ts embed', () => {
3128
3210
  type: index_1.EmbedEvent.ApiIntercept,
3129
3211
  data: JSON.stringify({
3130
3212
  input: '/api/test',
3131
- init: {}
3132
- })
3213
+ init: {},
3214
+ }),
3133
3215
  };
3134
3216
  const mockPort = {
3135
3217
  postMessage: jest.fn(),
@@ -3153,8 +3235,8 @@ describe('Unit test case for ts embed', () => {
3153
3235
  type: index_1.EmbedEvent.ApiIntercept,
3154
3236
  data: JSON.stringify({
3155
3237
  input: '/prism/?op=GetChartWithData',
3156
- init: {}
3157
- })
3238
+ init: {},
3239
+ }),
3158
3240
  };
3159
3241
  const mockPort = {
3160
3242
  postMessage: jest.fn(),
@@ -3195,15 +3277,15 @@ describe('Unit test case for ts embed', () => {
3195
3277
  type: index_1.EmbedEvent.ApiIntercept,
3196
3278
  data: JSON.stringify({
3197
3279
  input: '/prism/?op=GetChartWithData',
3198
- init: {}
3199
- })
3280
+ init: {},
3281
+ }),
3200
3282
  };
3201
3283
  const mockEventData2 = {
3202
3284
  type: index_1.EmbedEvent.ApiIntercept,
3203
3285
  data: JSON.stringify({
3204
3286
  input: '/prism/?op=LoadContextBook',
3205
- init: {}
3206
- })
3287
+ init: {},
3288
+ }),
3207
3289
  };
3208
3290
  const mockPort = {
3209
3291
  postMessage: jest.fn(),
@@ -3232,8 +3314,8 @@ describe('Unit test case for ts embed', () => {
3232
3314
  type: index_1.EmbedEvent.ApiIntercept,
3233
3315
  data: JSON.stringify({
3234
3316
  input: '/prism/?op=GetChartWithData',
3235
- init: {}
3236
- })
3317
+ init: {},
3318
+ }),
3237
3319
  };
3238
3320
  const mockPort = {
3239
3321
  postMessage: jest.fn(),
@@ -3264,8 +3346,8 @@ describe('Unit test case for ts embed', () => {
3264
3346
  type: index_1.EmbedEvent.ApiIntercept,
3265
3347
  data: JSON.stringify({
3266
3348
  input: '/prism/?op=GetChartWithData',
3267
- init: {}
3268
- })
3349
+ init: {},
3350
+ }),
3269
3351
  };
3270
3352
  const mockPort = {
3271
3353
  postMessage: jest.fn(),
@@ -3278,7 +3360,7 @@ describe('Unit test case for ts embed', () => {
3278
3360
  expect(capturedGetUnsavedAnswerTml).toBeDefined();
3279
3361
  const result = await capturedGetUnsavedAnswerTml({
3280
3362
  sessionId: 'session-123',
3281
- vizId: 'viz-456'
3363
+ vizId: 'viz-456',
3282
3364
  });
3283
3365
  expect(result).toBeUndefined();
3284
3366
  });
@@ -3293,8 +3375,8 @@ describe('Unit test case for ts embed', () => {
3293
3375
  type: index_1.EmbedEvent.ApiIntercept,
3294
3376
  data: JSON.stringify({
3295
3377
  input: '/prism/?op=LoadContextBook',
3296
- init: {}
3297
- })
3378
+ init: {},
3379
+ }),
3298
3380
  };
3299
3381
  const mockPort = {
3300
3382
  postMessage: jest.fn(),
@@ -3528,12 +3610,13 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3528
3610
  const setupPreRenderTest = async (preRenderId, initialConfig) => {
3529
3611
  (0, test_utils_1.createRootEleForEmbed)();
3530
3612
  (0, test_utils_1.mockMessageChannel)();
3531
- window.ResizeObserver = window.ResizeObserver
3532
- || jest.fn().mockImplementation(() => ({
3533
- disconnect: jest.fn(),
3534
- observe: jest.fn(),
3535
- unobserve: jest.fn(),
3536
- }));
3613
+ window.ResizeObserver =
3614
+ window.ResizeObserver ||
3615
+ jest.fn().mockImplementation(() => ({
3616
+ disconnect: jest.fn(),
3617
+ observe: jest.fn(),
3618
+ unobserve: jest.fn(),
3619
+ }));
3537
3620
  const embed1 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
3538
3621
  preRenderId,
3539
3622
  ...initialConfig,
@@ -3684,7 +3767,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3684
3767
  authType: index_1.AuthType.None,
3685
3768
  });
3686
3769
  });
3687
- // Matches the structure produced by createValidationError / embedErrorDetails
3770
+ // Matches the structure produced by createValidationError /
3771
+ // embedErrorDetails
3688
3772
  const makeNestedValidationData = (message = 'invalid payload') => ({
3689
3773
  type: index_1.EmbedEvent.Error,
3690
3774
  data: {
@@ -3694,7 +3778,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3694
3778
  error: message,
3695
3779
  },
3696
3780
  });
3697
- // 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
3698
3783
  const makeFlatValidationData = (message = 'invalid payload') => ({
3699
3784
  errorType: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3700
3785
  message,
@@ -3735,14 +3820,20 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3735
3820
  });
3736
3821
  test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is undefined', () => {
3737
3822
  const errorHandler = jest.fn();
3738
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: undefined });
3823
+ const embed = makeEmbed({
3824
+ useHostEventsV2: true,
3825
+ shouldBypassPayloadValidation: undefined,
3826
+ });
3739
3827
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3740
3828
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3741
3829
  expect(errorHandler).toHaveBeenCalled();
3742
3830
  });
3743
3831
  test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is false', () => {
3744
3832
  const errorHandler = jest.fn();
3745
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3833
+ const embed = makeEmbed({
3834
+ useHostEventsV2: true,
3835
+ shouldBypassPayloadValidation: false,
3836
+ });
3746
3837
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3747
3838
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3748
3839
  expect(errorHandler).toHaveBeenCalled();
@@ -3750,7 +3841,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3750
3841
  test('skips Error event when useHostEventsV2 is false regardless of shouldBypassPayloadValidation', () => {
3751
3842
  jest.spyOn(logger_1.logger, 'warn');
3752
3843
  const errorHandler = jest.fn();
3753
- const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: undefined });
3844
+ const embed = makeEmbed({
3845
+ useHostEventsV2: false,
3846
+ shouldBypassPayloadValidation: undefined,
3847
+ });
3754
3848
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3755
3849
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3756
3850
  expect(errorHandler).not.toHaveBeenCalled();
@@ -3766,7 +3860,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3766
3860
  test('skips Error event when useHostEventsV2 is false and shouldBypassPayloadValidation is true', () => {
3767
3861
  jest.spyOn(logger_1.logger, 'warn');
3768
3862
  const errorHandler = jest.fn();
3769
- const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: true });
3863
+ const embed = makeEmbed({
3864
+ useHostEventsV2: false,
3865
+ shouldBypassPayloadValidation: true,
3866
+ });
3770
3867
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3771
3868
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3772
3869
  expect(errorHandler).not.toHaveBeenCalled();
@@ -3791,14 +3888,20 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3791
3888
  });
3792
3889
  test('delivers Error event to EmbedEvent.ALL handler when not skipped', () => {
3793
3890
  const allHandler = jest.fn();
3794
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3891
+ const embed = makeEmbed({
3892
+ useHostEventsV2: true,
3893
+ shouldBypassPayloadValidation: false,
3894
+ });
3795
3895
  embed.on(index_1.EmbedEvent.ALL, allHandler);
3796
3896
  embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3797
3897
  expect(allHandler).toHaveBeenCalled();
3798
3898
  });
3799
3899
  test('does not skip non-Error events even with HOST_EVENT_VALIDATION error code', () => {
3800
3900
  const customActionHandler = jest.fn();
3801
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3901
+ const embed = makeEmbed({
3902
+ useHostEventsV2: true,
3903
+ shouldBypassPayloadValidation: false,
3904
+ });
3802
3905
  embed.on(index_1.EmbedEvent.CustomAction, customActionHandler);
3803
3906
  embed.executeCallbacks(index_1.EmbedEvent.CustomAction, {
3804
3907
  data: { code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION },
@@ -3807,7 +3910,10 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3807
3910
  });
3808
3911
  test('does not skip Error events with unrelated error codes', () => {
3809
3912
  const errorHandler = jest.fn();
3810
- const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3913
+ const embed = makeEmbed({
3914
+ useHostEventsV2: true,
3915
+ shouldBypassPayloadValidation: false,
3916
+ });
3811
3917
  embed.on(index_1.EmbedEvent.Error, errorHandler);
3812
3918
  embed.executeCallbacks(index_1.EmbedEvent.Error, {
3813
3919
  errorType: 'SOME_OTHER_ERROR',
@@ -3816,5 +3922,145 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3816
3922
  expect(errorHandler).toHaveBeenCalled();
3817
3923
  });
3818
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
+ });
3819
4065
  });
3820
4066
  //# sourceMappingURL=ts-embed.spec.js.map