@thoughtspot/visual-embed-sdk 1.26.6 → 1.26.7

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 (263) hide show
  1. package/README.md +2 -2
  2. package/cjs/package.json +1 -1
  3. package/cjs/src/auth.d.ts +4 -4
  4. package/cjs/src/auth.d.ts.map +1 -1
  5. package/cjs/src/auth.js +16 -9
  6. package/cjs/src/auth.js.map +1 -1
  7. package/cjs/src/embed/app.d.ts +15 -15
  8. package/cjs/src/embed/app.d.ts.map +1 -1
  9. package/cjs/src/embed/app.js +4 -3
  10. package/cjs/src/embed/app.js.map +1 -1
  11. package/cjs/src/embed/app.spec.js +5 -4
  12. package/cjs/src/embed/app.spec.js.map +1 -1
  13. package/cjs/src/embed/base.d.ts +1 -1
  14. package/cjs/src/embed/base.d.ts.map +1 -1
  15. package/cjs/src/embed/base.js +9 -6
  16. package/cjs/src/embed/base.js.map +1 -1
  17. package/cjs/src/embed/base.spec.js +4 -3
  18. package/cjs/src/embed/base.spec.js.map +1 -1
  19. package/cjs/src/embed/embed.spec.js +2 -1
  20. package/cjs/src/embed/embed.spec.js.map +1 -1
  21. package/cjs/src/embed/embedConfig.d.ts +2 -1
  22. package/cjs/src/embed/embedConfig.d.ts.map +1 -1
  23. package/cjs/src/embed/embedConfig.js +2 -0
  24. package/cjs/src/embed/embedConfig.js.map +1 -1
  25. package/cjs/src/embed/events.spec.js +3 -2
  26. package/cjs/src/embed/events.spec.js.map +1 -1
  27. package/cjs/src/embed/liveboard.d.ts +35 -23
  28. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  29. package/cjs/src/embed/liveboard.js +8 -4
  30. package/cjs/src/embed/liveboard.js.map +1 -1
  31. package/cjs/src/embed/liveboard.spec.js +2 -1
  32. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  33. package/cjs/src/embed/sage.d.ts +48 -30
  34. package/cjs/src/embed/sage.d.ts.map +1 -1
  35. package/cjs/src/embed/sage.js +7 -6
  36. package/cjs/src/embed/sage.js.map +1 -1
  37. package/cjs/src/embed/sage.spec.js +3 -3
  38. package/cjs/src/embed/sage.spec.js.map +1 -1
  39. package/cjs/src/embed/search-bar.d.ts +22 -6
  40. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  41. package/cjs/src/embed/search-bar.js.map +1 -1
  42. package/cjs/src/embed/search.d.ts +35 -16
  43. package/cjs/src/embed/search.d.ts.map +1 -1
  44. package/cjs/src/embed/search.js +10 -6
  45. package/cjs/src/embed/search.js.map +1 -1
  46. package/cjs/src/embed/search.spec.js +10 -0
  47. package/cjs/src/embed/search.spec.js.map +1 -1
  48. package/cjs/src/embed/ts-embed.d.ts +2 -1
  49. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  50. package/cjs/src/embed/ts-embed.js +45 -22
  51. package/cjs/src/embed/ts-embed.js.map +1 -1
  52. package/cjs/src/embed/ts-embed.spec.js +153 -32
  53. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  54. package/cjs/src/index.d.ts +2 -2
  55. package/cjs/src/index.d.ts.map +1 -1
  56. package/cjs/src/index.js +2 -1
  57. package/cjs/src/index.js.map +1 -1
  58. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  59. package/cjs/src/mixpanel-service.js +2 -1
  60. package/cjs/src/mixpanel-service.js.map +1 -1
  61. package/cjs/src/react/index.d.ts +1 -1
  62. package/cjs/src/react/index.d.ts.map +1 -1
  63. package/cjs/src/react/index.js +2 -1
  64. package/cjs/src/react/index.js.map +1 -1
  65. package/cjs/src/react/index.spec.js +2 -2
  66. package/cjs/src/react/index.spec.js.map +1 -1
  67. package/cjs/src/types.d.ts +742 -237
  68. package/cjs/src/types.d.ts.map +1 -1
  69. package/cjs/src/types.js +653 -169
  70. package/cjs/src/types.js.map +1 -1
  71. package/cjs/src/utils/authService/authService.d.ts.map +1 -1
  72. package/cjs/src/utils/authService/authService.js +3 -2
  73. package/cjs/src/utils/authService/authService.js.map +1 -1
  74. package/cjs/src/utils/authService/authService.spec.js +3 -2
  75. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  76. package/cjs/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  77. package/cjs/src/utils/authService/tokenizedAuthService.js +2 -1
  78. package/cjs/src/utils/authService/tokenizedAuthService.js.map +1 -1
  79. package/cjs/src/utils/graphql/answerService/answerService.d.ts +2 -4
  80. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  81. package/cjs/src/utils/graphql/answerService/answerService.js +2 -4
  82. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  83. package/cjs/src/utils/logger.d.ts +18 -0
  84. package/cjs/src/utils/logger.d.ts.map +1 -0
  85. package/cjs/src/utils/logger.js +80 -0
  86. package/cjs/src/utils/logger.js.map +1 -0
  87. package/cjs/src/utils/logger.spec.d.ts +25 -0
  88. package/cjs/src/utils/logger.spec.d.ts.map +1 -0
  89. package/cjs/src/utils/logger.spec.js +116 -0
  90. package/cjs/src/utils/logger.spec.js.map +1 -0
  91. package/cjs/src/utils/processData.d.ts +6 -0
  92. package/cjs/src/utils/processData.d.ts.map +1 -1
  93. package/cjs/src/utils/processData.js +5 -1
  94. package/cjs/src/utils/processData.js.map +1 -1
  95. package/cjs/src/utils/processTrigger.js +1 -1
  96. package/dist/src/auth.d.ts +4 -4
  97. package/dist/src/auth.d.ts.map +1 -1
  98. package/dist/src/embed/app.d.ts +15 -15
  99. package/dist/src/embed/app.d.ts.map +1 -1
  100. package/dist/src/embed/base.d.ts +1 -1
  101. package/dist/src/embed/base.d.ts.map +1 -1
  102. package/dist/src/embed/embedConfig.d.ts +2 -1
  103. package/dist/src/embed/embedConfig.d.ts.map +1 -1
  104. package/dist/src/embed/liveboard.d.ts +35 -23
  105. package/dist/src/embed/liveboard.d.ts.map +1 -1
  106. package/dist/src/embed/sage.d.ts +48 -30
  107. package/dist/src/embed/sage.d.ts.map +1 -1
  108. package/dist/src/embed/search-bar.d.ts +22 -6
  109. package/dist/src/embed/search-bar.d.ts.map +1 -1
  110. package/dist/src/embed/search.d.ts +35 -16
  111. package/dist/src/embed/search.d.ts.map +1 -1
  112. package/dist/src/embed/ts-embed.d.ts +2 -1
  113. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  114. package/dist/src/index.d.ts +2 -2
  115. package/dist/src/index.d.ts.map +1 -1
  116. package/dist/src/mixpanel-service.d.ts.map +1 -1
  117. package/dist/src/react/index.d.ts +1 -1
  118. package/dist/src/react/index.d.ts.map +1 -1
  119. package/dist/src/types.d.ts +742 -237
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/dist/src/utils/authService/authService.d.ts.map +1 -1
  122. package/dist/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  123. package/dist/src/utils/graphql/answerService/answerService.d.ts +2 -4
  124. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  125. package/dist/src/utils/logger.d.ts +18 -0
  126. package/dist/src/utils/logger.d.ts.map +1 -0
  127. package/dist/src/utils/logger.spec.d.ts +25 -0
  128. package/dist/src/utils/logger.spec.d.ts.map +1 -0
  129. package/dist/src/utils/processData.d.ts +6 -0
  130. package/dist/src/utils/processData.d.ts.map +1 -1
  131. package/dist/tsembed-react.es.js +3716 -3107
  132. package/dist/tsembed-react.js +3620 -3012
  133. package/dist/tsembed.es.js +9830 -9212
  134. package/dist/tsembed.js +15079 -14462
  135. package/dist/visual-embed-sdk-react-full.d.ts +923 -332
  136. package/dist/visual-embed-sdk-react.d.ts +923 -332
  137. package/dist/visual-embed-sdk.d.ts +923 -332
  138. package/lib/package.json +1 -1
  139. package/lib/src/auth.d.ts +4 -4
  140. package/lib/src/auth.d.ts.map +1 -1
  141. package/lib/src/auth.js +17 -10
  142. package/lib/src/auth.js.map +1 -1
  143. package/lib/src/embed/app.d.ts +15 -15
  144. package/lib/src/embed/app.d.ts.map +1 -1
  145. package/lib/src/embed/app.js +4 -3
  146. package/lib/src/embed/app.js.map +1 -1
  147. package/lib/src/embed/app.spec.js +5 -4
  148. package/lib/src/embed/app.spec.js.map +1 -1
  149. package/lib/src/embed/base.d.ts +1 -1
  150. package/lib/src/embed/base.d.ts.map +1 -1
  151. package/lib/src/embed/base.js +9 -6
  152. package/lib/src/embed/base.js.map +1 -1
  153. package/lib/src/embed/base.spec.js +5 -4
  154. package/lib/src/embed/base.spec.js.map +1 -1
  155. package/lib/src/embed/embed.spec.js +2 -1
  156. package/lib/src/embed/embed.spec.js.map +1 -1
  157. package/lib/src/embed/embedConfig.d.ts +2 -1
  158. package/lib/src/embed/embedConfig.d.ts.map +1 -1
  159. package/lib/src/embed/embedConfig.js +2 -0
  160. package/lib/src/embed/embedConfig.js.map +1 -1
  161. package/lib/src/embed/events.spec.js +3 -2
  162. package/lib/src/embed/events.spec.js.map +1 -1
  163. package/lib/src/embed/liveboard.d.ts +35 -23
  164. package/lib/src/embed/liveboard.d.ts.map +1 -1
  165. package/lib/src/embed/liveboard.js +8 -4
  166. package/lib/src/embed/liveboard.js.map +1 -1
  167. package/lib/src/embed/liveboard.spec.js +2 -1
  168. package/lib/src/embed/liveboard.spec.js.map +1 -1
  169. package/lib/src/embed/sage.d.ts +48 -30
  170. package/lib/src/embed/sage.d.ts.map +1 -1
  171. package/lib/src/embed/sage.js +7 -6
  172. package/lib/src/embed/sage.js.map +1 -1
  173. package/lib/src/embed/sage.spec.js +3 -3
  174. package/lib/src/embed/sage.spec.js.map +1 -1
  175. package/lib/src/embed/search-bar.d.ts +22 -6
  176. package/lib/src/embed/search-bar.d.ts.map +1 -1
  177. package/lib/src/embed/search-bar.js.map +1 -1
  178. package/lib/src/embed/search.d.ts +35 -16
  179. package/lib/src/embed/search.d.ts.map +1 -1
  180. package/lib/src/embed/search.js +11 -7
  181. package/lib/src/embed/search.js.map +1 -1
  182. package/lib/src/embed/search.spec.js +10 -0
  183. package/lib/src/embed/search.spec.js.map +1 -1
  184. package/lib/src/embed/ts-embed.d.ts +2 -1
  185. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  186. package/lib/src/embed/ts-embed.js +48 -25
  187. package/lib/src/embed/ts-embed.js.map +1 -1
  188. package/lib/src/embed/ts-embed.spec.js +153 -32
  189. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  190. package/lib/src/index.d.ts +2 -2
  191. package/lib/src/index.d.ts.map +1 -1
  192. package/lib/src/index.js +2 -2
  193. package/lib/src/index.js.map +1 -1
  194. package/lib/src/mixpanel-service.d.ts.map +1 -1
  195. package/lib/src/mixpanel-service.js +2 -1
  196. package/lib/src/mixpanel-service.js.map +1 -1
  197. package/lib/src/react/index.d.ts +1 -1
  198. package/lib/src/react/index.d.ts.map +1 -1
  199. package/lib/src/react/index.js +1 -1
  200. package/lib/src/react/index.js.map +1 -1
  201. package/lib/src/react/index.spec.js +2 -2
  202. package/lib/src/react/index.spec.js.map +1 -1
  203. package/lib/src/types.d.ts +742 -237
  204. package/lib/src/types.d.ts.map +1 -1
  205. package/lib/src/types.js +652 -168
  206. package/lib/src/types.js.map +1 -1
  207. package/lib/src/utils/authService/authService.d.ts.map +1 -1
  208. package/lib/src/utils/authService/authService.js +3 -2
  209. package/lib/src/utils/authService/authService.js.map +1 -1
  210. package/lib/src/utils/authService/authService.spec.js +4 -3
  211. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  212. package/lib/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  213. package/lib/src/utils/authService/tokenizedAuthService.js +2 -1
  214. package/lib/src/utils/authService/tokenizedAuthService.js.map +1 -1
  215. package/lib/src/utils/graphql/answerService/answerService.d.ts +2 -4
  216. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  217. package/lib/src/utils/graphql/answerService/answerService.js +2 -4
  218. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  219. package/lib/src/utils/logger.d.ts +18 -0
  220. package/lib/src/utils/logger.d.ts.map +1 -0
  221. package/lib/src/utils/logger.js +74 -0
  222. package/lib/src/utils/logger.js.map +1 -0
  223. package/lib/src/utils/logger.spec.d.ts +25 -0
  224. package/lib/src/utils/logger.spec.d.ts.map +1 -0
  225. package/lib/src/utils/logger.spec.js +93 -0
  226. package/lib/src/utils/logger.spec.js.map +1 -0
  227. package/lib/src/utils/processData.d.ts +6 -0
  228. package/lib/src/utils/processData.d.ts.map +1 -1
  229. package/lib/src/utils/processData.js +4 -1
  230. package/lib/src/utils/processData.js.map +1 -1
  231. package/lib/src/utils/processTrigger.js +1 -1
  232. package/lib/src/visual-embed-sdk.d.ts +927 -336
  233. package/package.json +1 -1
  234. package/src/auth.ts +20 -13
  235. package/src/embed/app.spec.ts +5 -4
  236. package/src/embed/app.ts +23 -22
  237. package/src/embed/base.spec.ts +6 -5
  238. package/src/embed/base.ts +18 -11
  239. package/src/embed/embed.spec.ts +2 -1
  240. package/src/embed/embedConfig.ts +2 -0
  241. package/src/embed/events.spec.ts +3 -2
  242. package/src/embed/liveboard.spec.ts +2 -1
  243. package/src/embed/liveboard.ts +43 -27
  244. package/src/embed/sage.spec.ts +3 -3
  245. package/src/embed/sage.ts +54 -36
  246. package/src/embed/search-bar.tsx +22 -6
  247. package/src/embed/search.spec.ts +13 -0
  248. package/src/embed/search.ts +46 -21
  249. package/src/embed/ts-embed.spec.ts +182 -43
  250. package/src/embed/ts-embed.ts +78 -59
  251. package/src/index.ts +2 -0
  252. package/src/mixpanel-service.ts +2 -1
  253. package/src/react/index.spec.tsx +2 -2
  254. package/src/react/index.tsx +1 -0
  255. package/src/types.ts +753 -245
  256. package/src/utils/authService/authService.spec.ts +7 -6
  257. package/src/utils/authService/authService.ts +4 -2
  258. package/src/utils/authService/tokenizedAuthService.ts +2 -1
  259. package/src/utils/graphql/answerService/answerService.ts +2 -4
  260. package/src/utils/logger.spec.ts +108 -0
  261. package/src/utils/logger.ts +88 -0
  262. package/src/utils/processData.ts +4 -1
  263. package/src/utils/processTrigger.ts +1 -1
@@ -1,37 +1,38 @@
1
1
  /* eslint-disable dot-notation */
2
+ import * as authInstance from '../auth';
2
3
  import { resetCachedAuthToken } from '../authToken';
4
+ import * as config from '../config';
3
5
  import {
6
+ AppEmbed,
4
7
  AuthType,
5
- init,
6
8
  EmbedEvent,
7
- SearchEmbed,
8
- PinboardEmbed,
9
- LiveboardViewConfig,
10
- AppEmbed,
11
9
  LiveboardEmbed,
10
+ LiveboardViewConfig,
11
+ PinboardEmbed,
12
+ SearchEmbed,
13
+ init,
12
14
  } from '../index';
15
+ import * as mixpanelInstance from '../mixpanel-service';
16
+ import { MIXPANEL_EVENT } from '../mixpanel-service';
13
17
  import {
14
- Action, HomeLeftNavItem, RuntimeFilter, RuntimeFilterOp, HomepageModule,
15
- } from '../types';
16
- import {
18
+ defaultParamsForPinboardEmbed,
17
19
  executeAfterWait,
20
+ expectUrlMatchesWithParams,
18
21
  getDocumentBody,
19
22
  getIFrameEl,
20
23
  getIFrameSrc,
21
24
  getRootEl,
25
+ mockMessageChannel,
22
26
  postMessageToParent,
23
- defaultParamsForPinboardEmbed,
24
27
  waitFor,
25
- expectUrlMatchesWithParams,
26
- mockMessageChannel,
27
28
  } from '../test/test-utils';
28
- import * as config from '../config';
29
- import * as tsEmbedInstance from './ts-embed';
30
- import * as mixpanelInstance from '../mixpanel-service';
31
- import * as authInstance from '../auth';
32
- import * as baseInstance from './base';
33
- import { MIXPANEL_EVENT } from '../mixpanel-service';
29
+ import {
30
+ Action, HomeLeftNavItem, HomepageModule, RuntimeFilter, RuntimeFilterOp,
31
+ } from '../types';
34
32
  import * as authService from '../utils/authService/authService';
33
+ import { logger } from '../utils/logger';
34
+ import * as baseInstance from './base';
35
+ import * as tsEmbedInstance from './ts-embed';
35
36
 
36
37
  const defaultViewConfig = {
37
38
  frameParams: {
@@ -425,7 +426,7 @@ describe('Unit test case for ts embed', () => {
425
426
  const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
426
427
  searchEmbed
427
428
  .on(EmbedEvent.Save, () => {
428
- console.log('non callable');
429
+ logger.log('non callable');
429
430
  })
430
431
  .render();
431
432
 
@@ -468,7 +469,7 @@ describe('Unit test case for ts embed', () => {
468
469
  .on(
469
470
  EmbedEvent.Save,
470
471
  () => {
471
- console.log('non callable');
472
+ logger.log('non callable');
472
473
  },
473
474
  { start: true },
474
475
  )
@@ -562,6 +563,144 @@ describe('Unit test case for ts embed', () => {
562
563
  });
563
564
  });
564
565
 
566
+ describe('Token fetch fails in cookieless authentication authType', () => {
567
+ beforeEach(() => {
568
+ jest.spyOn(authInstance, 'doCookielessTokenAuth').mockResolvedValueOnce(true);
569
+ init({
570
+ thoughtSpotHost: 'tshost',
571
+ customizations: customisations,
572
+ customCssUrl: 'http://localhost:5000',
573
+ authType: AuthType.TrustedAuthTokenCookieless,
574
+ getAuthToken: () => Promise.reject(),
575
+ });
576
+ });
577
+
578
+ afterEach(() => {
579
+ jest.clearAllMocks();
580
+ baseInstance.reset();
581
+ });
582
+
583
+ test('should show login failure message if token failed during app_init', async () => {
584
+ const a = jest.spyOn(authService, 'verifyTokenService');
585
+ a.mockResolvedValue(true);
586
+
587
+ // authVerifyMock.mockResolvedValue(true);
588
+ const mockEmbedEventPayload = {
589
+ type: EmbedEvent.APP_INIT,
590
+ data: {},
591
+ };
592
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
593
+ searchEmbed.render();
594
+ const mockPort: any = {
595
+ postMessage: jest.fn(),
596
+ };
597
+ await executeAfterWait(() => {
598
+ const iframe = getIFrameEl();
599
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
600
+ });
601
+ await executeAfterWait(() => {
602
+ expect(mockPort.postMessage).not.toHaveBeenCalled();
603
+ expect(getRootEl().innerHTML).toContain('Not logged in');
604
+ });
605
+
606
+ jest.spyOn(authService, 'verifyTokenService').mockClear();
607
+ });
608
+
609
+ test('should show login failure message if token failed during app_init prerender', async () => {
610
+ const a = jest.spyOn(authService, 'verifyTokenService');
611
+ a.mockResolvedValue(true);
612
+
613
+ // authVerifyMock.mockResolvedValue(true);
614
+ const mockEmbedEventPayload = {
615
+ type: EmbedEvent.APP_INIT,
616
+ data: {},
617
+ };
618
+ const searchEmbed = new SearchEmbed(getRootEl(), {
619
+ ...defaultViewConfig,
620
+ preRenderId: 'test',
621
+ });
622
+ searchEmbed.preRender();
623
+ const mockPort: any = {
624
+ postMessage: jest.fn(),
625
+ };
626
+ await executeAfterWait(() => {
627
+ const iframe = getIFrameEl();
628
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
629
+ });
630
+ const preRenderWrapper = document.getElementById('tsEmbed-pre-render-wrapper-test');
631
+ await executeAfterWait(() => {
632
+ expect(mockPort.postMessage).not.toHaveBeenCalled();
633
+ expect(preRenderWrapper.innerHTML).toContain('Not logged in');
634
+ });
635
+
636
+ jest.spyOn(authService, 'verifyTokenService').mockClear();
637
+ });
638
+
639
+ test('should show login failure message if update token failed', async () => {
640
+ const a = jest.spyOn(authService, 'verifyTokenService');
641
+ a.mockResolvedValue(true);
642
+
643
+ // authVerifyMock.mockResolvedValue(true);
644
+ const mockEmbedEventPayload = {
645
+ type: EmbedEvent.AuthExpire,
646
+ data: {},
647
+ };
648
+ const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
649
+ jest.spyOn(baseInstance, 'notifyAuthFailure');
650
+ searchEmbed.render();
651
+ const mockPort: any = {
652
+ postMessage: jest.fn(),
653
+ };
654
+ await executeAfterWait(() => {
655
+ const iframe = getIFrameEl();
656
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
657
+ });
658
+ await executeAfterWait(() => {
659
+ expect(getRootEl().innerHTML).toContain('Not logged in');
660
+ expect(baseInstance.notifyAuthFailure).toBeCalledWith(
661
+ authInstance.AuthFailureType.EXPIRY,
662
+ );
663
+ });
664
+
665
+ jest.spyOn(authService, 'verifyTokenService').mockClear();
666
+ jest.spyOn(baseInstance, 'notifyAuthFailure').mockClear();
667
+ });
668
+
669
+ test('should show login failure message if update token failed prerender', async () => {
670
+ const a = jest.spyOn(authService, 'verifyTokenService');
671
+ a.mockResolvedValue(true);
672
+
673
+ // authVerifyMock.mockResolvedValue(true);
674
+ const mockEmbedEventPayload = {
675
+ type: EmbedEvent.AuthExpire,
676
+ data: {},
677
+ };
678
+ const searchEmbed = new SearchEmbed(getRootEl(), {
679
+ ...defaultViewConfig,
680
+ preRenderId: 'test',
681
+ });
682
+ jest.spyOn(baseInstance, 'notifyAuthFailure');
683
+ searchEmbed.preRender();
684
+ const mockPort: any = {
685
+ postMessage: jest.fn(),
686
+ };
687
+ await executeAfterWait(() => {
688
+ const iframe = getIFrameEl();
689
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
690
+ });
691
+ const preRenderWrapper = document.getElementById('tsEmbed-pre-render-wrapper-test');
692
+ await executeAfterWait(() => {
693
+ expect(preRenderWrapper.innerHTML).toContain('Not logged in');
694
+ expect(baseInstance.notifyAuthFailure).toBeCalledWith(
695
+ authInstance.AuthFailureType.EXPIRY,
696
+ );
697
+ });
698
+
699
+ jest.spyOn(authService, 'verifyTokenService').mockClear();
700
+ jest.spyOn(baseInstance, 'notifyAuthFailure').mockClear();
701
+ });
702
+ });
703
+
565
704
  xdescribe('AuthExpire embedEvent in TrustedAuthToken authType', () => {
566
705
  test('AutoLogin true scenario', async () => {
567
706
  init({
@@ -698,7 +837,7 @@ describe('Unit test case for ts embed', () => {
698
837
  const iFrame: any = document.createElement('div');
699
838
  iFrame.contentWindow = null;
700
839
  jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
701
- spyOn(console, 'error');
840
+ spyOn(logger, 'error');
702
841
  tsEmbed.render();
703
842
  });
704
843
 
@@ -712,7 +851,7 @@ describe('Unit test case for ts embed', () => {
712
851
 
713
852
  describe('when visible actions are set', () => {
714
853
  test('should throw error when there are both visible and hidden actions - pinboard', async () => {
715
- spyOn(console, 'error');
854
+ spyOn(logger, 'error');
716
855
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
717
856
  hiddenActions: [Action.DownloadAsCsv],
718
857
  visibleActions: [Action.DownloadAsCsv],
@@ -721,7 +860,7 @@ describe('Unit test case for ts embed', () => {
721
860
  } as LiveboardViewConfig);
722
861
  await pinboardEmbed.render();
723
862
  expect(pinboardEmbed['isError']).toBe(true);
724
- expect(console.error).toHaveBeenCalledWith(
863
+ expect(logger.error).toHaveBeenCalledWith(
725
864
  'You cannot have both hidden actions and visible actions',
726
865
  );
727
866
  });
@@ -744,7 +883,7 @@ describe('Unit test case for ts embed', () => {
744
883
  hiddenActions: Array<Action>,
745
884
  visibleActions: Array<Action>,
746
885
  ) {
747
- spyOn(console, 'error');
886
+ spyOn(logger, 'error');
748
887
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
749
888
  hiddenActions,
750
889
  visibleActions,
@@ -753,7 +892,7 @@ describe('Unit test case for ts embed', () => {
753
892
  } as LiveboardViewConfig);
754
893
  await liveboardEmbed.render();
755
894
  expect(liveboardEmbed['isError']).toBe(true);
756
- expect(console.error).toHaveBeenCalledWith(
895
+ expect(logger.error).toHaveBeenCalledWith(
757
896
  'You cannot have both hidden actions and visible actions',
758
897
  );
759
898
  }
@@ -789,7 +928,7 @@ describe('Unit test case for ts embed', () => {
789
928
 
790
929
  describe('when visible Tabs are set', () => {
791
930
  test('should throw error when there are both visible and hidden Tabs - pinboard', async () => {
792
- spyOn(console, 'error');
931
+ spyOn(logger, 'error');
793
932
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
794
933
  visibleTabs: [tabId1],
795
934
  hiddenTabs: [tabId2],
@@ -798,7 +937,7 @@ describe('Unit test case for ts embed', () => {
798
937
  } as LiveboardViewConfig);
799
938
  await pinboardEmbed.render();
800
939
  expect(pinboardEmbed['isError']).toBe(true);
801
- expect(console.error).toHaveBeenCalledWith(
940
+ expect(logger.error).toHaveBeenCalledWith(
802
941
  'You cannot have both hidden Tabs and visible Tabs',
803
942
  );
804
943
  });
@@ -821,7 +960,7 @@ describe('Unit test case for ts embed', () => {
821
960
  hiddenTabs: Array<string>,
822
961
  visibleTabs: Array<string>,
823
962
  ) {
824
- spyOn(console, 'error');
963
+ spyOn(logger, 'error');
825
964
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
826
965
  hiddenTabs,
827
966
  visibleTabs,
@@ -830,7 +969,7 @@ describe('Unit test case for ts embed', () => {
830
969
  } as LiveboardViewConfig);
831
970
  await liveboardEmbed.render();
832
971
  expect(liveboardEmbed['isError']).toBe(true);
833
- expect(console.error).toHaveBeenCalledWith(
972
+ expect(logger.error).toHaveBeenCalledWith(
834
973
  'You cannot have both hidden Tabs and visible Tabs',
835
974
  );
836
975
  }
@@ -874,11 +1013,11 @@ describe('Unit test case for ts embed', () => {
874
1013
  });
875
1014
 
876
1015
  test('Error should be true', async () => {
877
- spyOn(console, 'error');
1016
+ spyOn(logger, 'error');
878
1017
  const tsEmbed = new SearchEmbed(getRootEl(), {});
879
1018
  tsEmbed.render();
880
1019
  expect(tsEmbed['isError']).toBe(true);
881
- expect(console.error).toHaveBeenCalledWith(
1020
+ expect(logger.error).toHaveBeenCalledWith(
882
1021
  'You need to init the ThoughtSpot SDK module first',
883
1022
  );
884
1023
  });
@@ -886,13 +1025,13 @@ describe('Unit test case for ts embed', () => {
886
1025
 
887
1026
  describe('V1Embed ', () => {
888
1027
  test('when isRendered is true than isError will be true', () => {
889
- spyOn(console, 'error');
1028
+ spyOn(logger, 'error');
890
1029
  const viEmbedIns = new tsEmbedInstance.V1Embed(getRootEl(), defaultViewConfig);
891
1030
  expect(viEmbedIns['isError']).toBe(false);
892
1031
  viEmbedIns.render();
893
1032
  viEmbedIns.on(EmbedEvent.CustomAction, jest.fn()).render();
894
1033
  expect(viEmbedIns['isError']).toBe(true);
895
- expect(console.error).toHaveBeenCalledWith(
1034
+ expect(logger.error).toHaveBeenCalledWith(
896
1035
  'Please register event handlers before calling render',
897
1036
  );
898
1037
  });
@@ -933,7 +1072,7 @@ describe('Unit test case for ts embed', () => {
933
1072
  });
934
1073
 
935
1074
  test('navigateToPage function use before render', async () => {
936
- spyOn(console, 'log');
1075
+ spyOn(logger, 'log');
937
1076
  const appEmbed = new AppEmbed(getRootEl(), {
938
1077
  frameParams: {
939
1078
  width: '100%',
@@ -942,7 +1081,7 @@ describe('Unit test case for ts embed', () => {
942
1081
  });
943
1082
  appEmbed.navigateToPage(path, false);
944
1083
  await appEmbed.render();
945
- expect(console.log).toHaveBeenCalledWith(
1084
+ expect(logger.log).toHaveBeenCalledWith(
946
1085
  'Please call render before invoking this method',
947
1086
  );
948
1087
  });
@@ -1330,7 +1469,7 @@ describe('Unit test case for ts embed', () => {
1330
1469
  });
1331
1470
 
1332
1471
  // show preRender
1333
- const warnSpy = spyOn(console, 'warn');
1472
+ const warnSpy = spyOn(logger, 'warn');
1334
1473
  libEmbed.showPreRender();
1335
1474
  expect(warnSpy).toHaveBeenCalledTimes(0);
1336
1475
 
@@ -1360,13 +1499,13 @@ describe('Unit test case for ts embed', () => {
1360
1499
  it('preRender called without preRenderId should log error ', () => {
1361
1500
  createRootEleForEmbed();
1362
1501
 
1363
- spyOn(console, 'error');
1502
+ spyOn(logger, 'error');
1364
1503
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
1365
1504
  liveboardId: 'myLiveboardId',
1366
1505
  });
1367
1506
  libEmbed.preRender();
1368
1507
 
1369
- expect(console.error).toHaveBeenCalledWith('PreRender id is required for preRender');
1508
+ expect(logger.error).toHaveBeenCalledWith('PreRender id is required for preRender');
1370
1509
  });
1371
1510
 
1372
1511
  it('showPreRender should preRender if not available', async () => {
@@ -1414,7 +1553,7 @@ describe('Unit test case for ts embed', () => {
1414
1553
 
1415
1554
  libEmbed.preRender();
1416
1555
  await waitFor(() => !!getIFrameEl());
1417
- const warnSpy = jest.spyOn(console, 'warn');
1556
+ const warnSpy = jest.spyOn(logger, 'warn');
1418
1557
  const newEmbed = new LiveboardEmbed('#tsEmbedDiv', {
1419
1558
  preRenderId: 'i-am-preRendered',
1420
1559
  liveboardId: 'awdawda',
@@ -1433,10 +1572,10 @@ describe('Unit test case for ts embed', () => {
1433
1572
  liveboardId: 'myLiveboardId',
1434
1573
  });
1435
1574
  spyOn(libEmbed, 'preRender');
1436
- spyOn(console, 'error');
1575
+ spyOn(logger, 'error');
1437
1576
  libEmbed.showPreRender();
1438
1577
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
1439
- expect(console.error).toHaveBeenCalledTimes(1);
1578
+ expect(logger.error).toHaveBeenCalledTimes(1);
1440
1579
  });
1441
1580
 
1442
1581
  it('should get underlying iframe', async () => {
@@ -1464,16 +1603,16 @@ describe('Unit test case for ts embed', () => {
1464
1603
  );
1465
1604
  });
1466
1605
  it('should log error if sync is called before preRender', async () => {
1467
- jest.spyOn(console, 'error').mockImplementation(jest.fn());
1606
+ jest.spyOn(logger, 'error').mockImplementation(jest.fn());
1468
1607
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
1469
1608
  liveboardId: 'myLiveboardId',
1470
1609
  preRenderId: 'test',
1471
1610
  });
1472
1611
  await libEmbed.syncPreRenderStyle();
1473
- expect(console.error).toBeCalledWith(
1612
+ expect(logger.error).toBeCalledWith(
1474
1613
  'PreRender should be called before using syncPreRenderStyle',
1475
1614
  );
1476
- (console.error as any).mockClear();
1615
+ (logger.error as any).mockClear();
1477
1616
  });
1478
1617
  });
1479
1618
  });
@@ -8,57 +8,54 @@
8
8
  */
9
9
 
10
10
  import isEqual from 'lodash/isEqual';
11
-
11
+ import pkgInfo from '../../package.json';
12
+ import { AuthFailureType } from '../auth';
12
13
  import { getAuthenticationToken } from '../authToken';
13
- import { AnswerService } from '../utils/graphql/answerService/answerService';
14
14
  import {
15
- getEncodedQueryParamsString,
16
- getCssDimension,
17
- getOffsetTop,
18
- embedEventStatus,
19
- setAttributes,
20
- getCustomisations,
21
- getRuntimeFilters,
22
- getDOMNode,
23
- getFilterQuery,
24
- getQueryParamString,
25
- getRuntimeParameters,
26
- setStyleProperties,
27
- removeStyleProperties,
28
- isUndefined,
29
- } from '../utils';
30
- import {
31
- getThoughtSpotHost,
32
- URL_MAX_LENGTH,
33
- DEFAULT_EMBED_WIDTH,
34
15
  DEFAULT_EMBED_HEIGHT,
16
+ DEFAULT_EMBED_WIDTH,
17
+ URL_MAX_LENGTH,
18
+ getThoughtSpotHost,
35
19
  getV2BasePath,
36
20
  } from '../config';
21
+ import { MIXPANEL_EVENT, uploadMixpanelEvent } from '../mixpanel-service';
37
22
  import {
23
+ Action,
38
24
  AuthType,
25
+ ContextMenuTriggerOptions,
39
26
  DOMSelector,
40
- HostEvent,
27
+ EmbedConfig,
41
28
  EmbedEvent,
29
+ HostEvent,
42
30
  MessageCallback,
43
- Action,
44
- Param,
45
- EmbedConfig,
46
- MessageOptions,
47
- MessagePayload,
48
31
  MessageCallbackObj,
32
+ MessageOptions,
33
+ Param,
49
34
  ViewConfig,
50
- FrameParams,
51
- ContextMenuTriggerOptions,
52
- RuntimeFilter,
53
35
  } from '../types';
54
- import { uploadMixpanelEvent, MIXPANEL_EVENT } from '../mixpanel-service';
55
- import { processEventData } from '../utils/processData';
36
+ import {
37
+ embedEventStatus,
38
+ getCssDimension,
39
+ getCustomisations,
40
+ getDOMNode,
41
+ getEncodedQueryParamsString,
42
+ getFilterQuery,
43
+ getOffsetTop,
44
+ getQueryParamString,
45
+ getRuntimeFilters,
46
+ getRuntimeParameters,
47
+ isUndefined,
48
+ removeStyleProperties,
49
+ setAttributes,
50
+ setStyleProperties,
51
+ } from '../utils';
52
+ import { AnswerService } from '../utils/graphql/answerService/answerService';
53
+ import { logger } from '../utils/logger';
54
+ import { processAuthFailure, processEventData } from '../utils/processData';
56
55
  import { processTrigger } from '../utils/processTrigger';
57
- import pkgInfo from '../../package.json';
58
56
  import {
59
- getAuthPromise, renderInQueue, handleAuth, notifyAuthFailure,
57
+ getAuthPromise, handleAuth, notifyAuthFailure, renderInQueue,
60
58
  } from './base';
61
- import { AuthFailureType } from '../auth';
62
59
  import { getEmbedConfig } from './embedConfig';
63
60
 
64
61
  const { version } = pkgInfo;
@@ -196,7 +193,7 @@ export class TsEmbed {
196
193
  error,
197
194
  });
198
195
  // Log error
199
- console.error(error);
196
+ logger.error(error);
200
197
  }
201
198
 
202
199
  /**
@@ -280,7 +277,7 @@ export class TsEmbed {
280
277
  this.executeCallbacks(EmbedEvent.Error, {
281
278
  offlineWarning,
282
279
  });
283
- console.warn(offlineWarning);
280
+ logger.warn(offlineWarning);
284
281
  };
285
282
  window.addEventListener('offline', offlineEventListener);
286
283
 
@@ -306,7 +303,12 @@ export class TsEmbed {
306
303
  private appInitCb = async (_: any, responder: any) => {
307
304
  let authToken = '';
308
305
  if (this.embedConfig.authType === AuthType.TrustedAuthTokenCookieless) {
309
- authToken = await getAuthenticationToken(this.embedConfig);
306
+ try {
307
+ authToken = await getAuthenticationToken(this.embedConfig);
308
+ } catch (e) {
309
+ processAuthFailure(e, this.isPreRendered ? this.preRenderWrapper : this.el);
310
+ return;
311
+ }
310
312
  }
311
313
  this.isAppInitialized = true;
312
314
  responder({
@@ -336,11 +338,16 @@ export class TsEmbed {
336
338
  private updateAuthToken = async (_: any, responder: any) => {
337
339
  const { autoLogin = false, authType } = this.embedConfig; // Set autoLogin default to false
338
340
  if (authType === AuthType.TrustedAuthTokenCookieless) {
339
- const authToken = await getAuthenticationToken(this.embedConfig);
340
- responder({
341
- type: EmbedEvent.AuthExpire,
342
- data: { authToken },
343
- });
341
+ let authToken = '';
342
+ try {
343
+ authToken = await getAuthenticationToken(this.embedConfig);
344
+ responder({
345
+ type: EmbedEvent.AuthExpire,
346
+ data: { authToken },
347
+ });
348
+ } catch (e) {
349
+ processAuthFailure(e, this.isPreRendered ? this.preRenderWrapper : this.el);
350
+ }
344
351
  } else if (autoLogin) {
345
352
  handleAuth();
346
353
  }
@@ -490,6 +497,9 @@ export class TsEmbed {
490
497
  queryParams[Param.ShowInsertToSlide] = insertInToSlide;
491
498
  }
492
499
 
500
+ queryParams[Param.OverrideNativeConsole] = true;
501
+ queryParams[Param.ClientLogLevel] = this.embedConfig.logLevel;
502
+
493
503
  return queryParams;
494
504
  }
495
505
 
@@ -505,7 +515,11 @@ export class TsEmbed {
505
515
  const queryParams = this.shouldEncodeUrlQueryParams
506
516
  ? `?base64UrlEncodedFlags=${getEncodedQueryParamsString(queryString)}`
507
517
  : `?${queryString}`;
508
- const path = `${this.thoughtSpotHost}/${queryParams}#`;
518
+ let host = this.thoughtSpotHost;
519
+ if (!isUndefined(this.embedConfig.enableReactShell)) {
520
+ host = (this.embedConfig.enableReactShell as boolean) ? '/v2' : '/v1';
521
+ }
522
+ const path = `${host}/${queryParams}#`;
509
523
  return path;
510
524
  }
511
525
 
@@ -524,6 +538,7 @@ export class TsEmbed {
524
538
 
525
539
  iFrame.src = frameSrc;
526
540
  iFrame.id = TS_EMBED_ID;
541
+ iFrame.setAttribute('data-ts-iframe', 'true');
527
542
 
528
543
  // according to screenfull.js documentation
529
544
  // allowFullscreen, webkitallowfullscreen and mozallowfullscreen must be
@@ -664,7 +679,7 @@ export class TsEmbed {
664
679
  protected connectPreRendered(): boolean {
665
680
  const preRenderIds = this.getPreRenderIds();
666
681
  this.preRenderWrapper = this.preRenderWrapper
667
- || document.getElementById(preRenderIds.wrapper);
682
+ || document.getElementById(preRenderIds.wrapper);
668
683
 
669
684
  this.preRenderChild = this.preRenderChild || document.getElementById(preRenderIds.child);
670
685
 
@@ -935,10 +950,10 @@ export class TsEmbed {
935
950
  });
936
951
  } catch (e) {
937
952
  eventPort.postMessage({ error: e });
938
- console.log(e);
953
+ logger.log(e);
939
954
  }
940
955
  } else {
941
- console.log('Event Port is not defined');
956
+ logger.log('Event Port is not defined');
942
957
  }
943
958
  }
944
959
 
@@ -966,6 +981,10 @@ export class TsEmbed {
966
981
  return this;
967
982
  }
968
983
 
984
+ public getIframeSrc(): string {
985
+ return '';
986
+ }
987
+
969
988
  protected handleRenderForPrerender() {
970
989
  this.render();
971
990
  }
@@ -977,7 +996,7 @@ export class TsEmbed {
977
996
  */
978
997
  public preRender(showPreRenderByDefault = false): TsEmbed {
979
998
  if (!this.viewConfig.preRenderId) {
980
- console.error('PreRender id is required for preRender');
999
+ logger.error('PreRender id is required for preRender');
981
1000
  return this;
982
1001
  }
983
1002
  this.isPreRendered = true;
@@ -1026,7 +1045,7 @@ export class TsEmbed {
1026
1045
  this.insertedDomEl?.parentNode.removeChild(this.insertedDomEl);
1027
1046
  this.unsubscribeToEvents();
1028
1047
  } catch (e) {
1029
- console.log('Error destroying TS Embed', e);
1048
+ logger.log('Error destroying TS Embed', e);
1030
1049
  }
1031
1050
  }
1032
1051
 
@@ -1066,13 +1085,13 @@ export class TsEmbed {
1066
1085
  !isUndefined(viewConfig[key])
1067
1086
  && !isEqual(viewConfig[key], preRenderedObject.viewConfig[key])
1068
1087
  ) {
1069
- console.warn(
1070
- 'TS Embed component was pre-rendered with '
1071
- + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1072
- + `but a different value "${JSON.stringify(viewConfig[key])}" `
1073
- + 'was passed to the Embed component. '
1074
- + 'The new value provided is ignored, the value provided during '
1075
- + 'preRender is used.',
1088
+ logger.warn(
1089
+ `${viewConfig.embedComponentType || 'Component'} was pre-rendered with `
1090
+ + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1091
+ + `but a different value "${JSON.stringify(viewConfig[key])}" `
1092
+ + 'was passed to the Embed component. '
1093
+ + 'The new value provided is ignored, the value provided during '
1094
+ + 'preRender is used.',
1076
1095
  );
1077
1096
  }
1078
1097
  });
@@ -1087,7 +1106,7 @@ export class TsEmbed {
1087
1106
  */
1088
1107
  public showPreRender(): void {
1089
1108
  if (!this.viewConfig.preRenderId) {
1090
- console.error('PreRender id is required for preRender');
1109
+ logger.error('PreRender id is required for preRender');
1091
1110
  return;
1092
1111
  }
1093
1112
  if (!this.isPreRenderAvailable()) {
@@ -1136,7 +1155,7 @@ export class TsEmbed {
1136
1155
  */
1137
1156
  public syncPreRenderStyle(): void {
1138
1157
  if (!this.isPreRenderAvailable() || !this.el) {
1139
- console.error('PreRender should be called before using syncPreRenderStyle');
1158
+ logger.error('PreRender should be called before using syncPreRenderStyle');
1140
1159
  return;
1141
1160
  }
1142
1161
  const elBoundingClient = this.el.getBoundingClientRect();
@@ -1156,7 +1175,7 @@ export class TsEmbed {
1156
1175
  public hidePreRender(): void {
1157
1176
  if (!this.isPreRenderAvailable()) {
1158
1177
  // if the embed component is not preRendered , nothing to hide
1159
- console.warn('PreRender should be called before hiding it using hidePreRender.');
1178
+ logger.warn('PreRender should be called before hiding it using hidePreRender.');
1160
1179
  return;
1161
1180
  }
1162
1181
  const preRenderHideStyles = {
package/src/index.ts CHANGED
@@ -45,6 +45,7 @@ import {
45
45
  customCssInterface,
46
46
  ContextMenuTriggerOptions,
47
47
  RuntimeParameter,
48
+ LogLevel,
48
49
  } from './types';
49
50
  import { CustomCssVariables } from './css-variables';
50
51
  import { SageEmbed, SageViewConfig } from './embed/sage';
@@ -101,4 +102,5 @@ export {
101
102
  customCssInterface,
102
103
  CustomCssVariables,
103
104
  RuntimeParameter,
105
+ LogLevel,
104
106
  };