@thoughtspot/visual-embed-sdk 1.27.0-alpha.0 → 1.27.0-logger

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 (189) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/auth.d.ts.map +1 -1
  3. package/cjs/src/auth.js +5 -4
  4. package/cjs/src/auth.js.map +1 -1
  5. package/cjs/src/embed/app.d.ts +1 -1
  6. package/cjs/src/embed/app.d.ts.map +1 -1
  7. package/cjs/src/embed/app.js +3 -2
  8. package/cjs/src/embed/app.js.map +1 -1
  9. package/cjs/src/embed/app.spec.js +5 -4
  10. package/cjs/src/embed/app.spec.js.map +1 -1
  11. package/cjs/src/embed/base.d.ts.map +1 -1
  12. package/cjs/src/embed/base.js +5 -2
  13. package/cjs/src/embed/base.js.map +1 -1
  14. package/cjs/src/embed/base.spec.js +3 -2
  15. package/cjs/src/embed/base.spec.js.map +1 -1
  16. package/cjs/src/embed/embed.spec.js +2 -1
  17. package/cjs/src/embed/embed.spec.js.map +1 -1
  18. package/cjs/src/embed/embedConfig.d.ts +2 -1
  19. package/cjs/src/embed/embedConfig.d.ts.map +1 -1
  20. package/cjs/src/embed/embedConfig.js +2 -0
  21. package/cjs/src/embed/embedConfig.js.map +1 -1
  22. package/cjs/src/embed/events.spec.js +3 -2
  23. package/cjs/src/embed/events.spec.js.map +1 -1
  24. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  25. package/cjs/src/embed/liveboard.js.map +1 -1
  26. package/cjs/src/embed/sage.d.ts +1 -1
  27. package/cjs/src/embed/sage.d.ts.map +1 -1
  28. package/cjs/src/embed/sage.js.map +1 -1
  29. package/cjs/src/embed/search.d.ts +1 -1
  30. package/cjs/src/embed/search.d.ts.map +1 -1
  31. package/cjs/src/embed/search.js +2 -3
  32. package/cjs/src/embed/search.js.map +1 -1
  33. package/cjs/src/embed/ts-embed.d.ts +0 -1
  34. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  35. package/cjs/src/embed/ts-embed.js +13 -13
  36. package/cjs/src/embed/ts-embed.js.map +1 -1
  37. package/cjs/src/embed/ts-embed.spec.js +27 -26
  38. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  39. package/cjs/src/index.d.ts +2 -2
  40. package/cjs/src/index.d.ts.map +1 -1
  41. package/cjs/src/index.js +2 -1
  42. package/cjs/src/index.js.map +1 -1
  43. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  44. package/cjs/src/mixpanel-service.js +2 -1
  45. package/cjs/src/mixpanel-service.js.map +1 -1
  46. package/cjs/src/react/index.spec.js +2 -2
  47. package/cjs/src/react/index.spec.js.map +1 -1
  48. package/cjs/src/types.d.ts +25 -1
  49. package/cjs/src/types.d.ts.map +1 -1
  50. package/cjs/src/types.js +12 -1
  51. package/cjs/src/types.js.map +1 -1
  52. package/cjs/src/utils/authService/authService.d.ts.map +1 -1
  53. package/cjs/src/utils/authService/authService.js +3 -2
  54. package/cjs/src/utils/authService/authService.js.map +1 -1
  55. package/cjs/src/utils/authService/authService.spec.js +3 -2
  56. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  57. package/cjs/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  58. package/cjs/src/utils/authService/tokenizedAuthService.js +2 -1
  59. package/cjs/src/utils/authService/tokenizedAuthService.js.map +1 -1
  60. package/cjs/src/utils/logger.d.ts +18 -0
  61. package/cjs/src/utils/logger.d.ts.map +1 -0
  62. package/cjs/src/utils/logger.js +78 -0
  63. package/cjs/src/utils/logger.js.map +1 -0
  64. package/cjs/src/utils/logger.spec.d.ts +25 -0
  65. package/cjs/src/utils/logger.spec.d.ts.map +1 -0
  66. package/cjs/src/utils/logger.spec.js +80 -0
  67. package/cjs/src/utils/logger.spec.js.map +1 -0
  68. package/dist/src/auth.d.ts.map +1 -1
  69. package/dist/src/embed/app.d.ts +1 -1
  70. package/dist/src/embed/app.d.ts.map +1 -1
  71. package/dist/src/embed/base.d.ts.map +1 -1
  72. package/dist/src/embed/embedConfig.d.ts +2 -1
  73. package/dist/src/embed/embedConfig.d.ts.map +1 -1
  74. package/dist/src/embed/liveboard.d.ts.map +1 -1
  75. package/dist/src/embed/sage.d.ts +1 -1
  76. package/dist/src/embed/sage.d.ts.map +1 -1
  77. package/dist/src/embed/search.d.ts +1 -1
  78. package/dist/src/embed/search.d.ts.map +1 -1
  79. package/dist/src/embed/ts-embed.d.ts +0 -1
  80. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  81. package/dist/src/index.d.ts +2 -2
  82. package/dist/src/index.d.ts.map +1 -1
  83. package/dist/src/mixpanel-service.d.ts.map +1 -1
  84. package/dist/src/types.d.ts +25 -1
  85. package/dist/src/types.d.ts.map +1 -1
  86. package/dist/src/utils/authService/authService.d.ts.map +1 -1
  87. package/dist/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  88. package/dist/src/utils/logger.d.ts +18 -0
  89. package/dist/src/utils/logger.d.ts.map +1 -0
  90. package/dist/src/utils/logger.spec.d.ts +25 -0
  91. package/dist/src/utils/logger.spec.d.ts.map +1 -0
  92. package/dist/tsembed-react.es.js +17309 -33
  93. package/dist/tsembed-react.js +17309 -33
  94. package/dist/tsembed.es.js +17636 -354
  95. package/dist/tsembed.js +32457 -15176
  96. package/dist/visual-embed-sdk-react-full.d.ts +28 -25
  97. package/dist/visual-embed-sdk-react.d.ts +28 -25
  98. package/dist/visual-embed-sdk.d.ts +28 -25
  99. package/lib/package.json +1 -1
  100. package/lib/src/auth.d.ts.map +1 -1
  101. package/lib/src/auth.js +5 -4
  102. package/lib/src/auth.js.map +1 -1
  103. package/lib/src/embed/app.d.ts +1 -1
  104. package/lib/src/embed/app.d.ts.map +1 -1
  105. package/lib/src/embed/app.js +3 -2
  106. package/lib/src/embed/app.js.map +1 -1
  107. package/lib/src/embed/app.spec.js +5 -4
  108. package/lib/src/embed/app.spec.js.map +1 -1
  109. package/lib/src/embed/base.d.ts.map +1 -1
  110. package/lib/src/embed/base.js +6 -3
  111. package/lib/src/embed/base.js.map +1 -1
  112. package/lib/src/embed/base.spec.js +3 -2
  113. package/lib/src/embed/base.spec.js.map +1 -1
  114. package/lib/src/embed/embed.spec.js +2 -1
  115. package/lib/src/embed/embed.spec.js.map +1 -1
  116. package/lib/src/embed/embedConfig.d.ts +2 -1
  117. package/lib/src/embed/embedConfig.d.ts.map +1 -1
  118. package/lib/src/embed/embedConfig.js +2 -0
  119. package/lib/src/embed/embedConfig.js.map +1 -1
  120. package/lib/src/embed/events.spec.js +3 -2
  121. package/lib/src/embed/events.spec.js.map +1 -1
  122. package/lib/src/embed/liveboard.d.ts.map +1 -1
  123. package/lib/src/embed/liveboard.js.map +1 -1
  124. package/lib/src/embed/sage.d.ts +1 -1
  125. package/lib/src/embed/sage.d.ts.map +1 -1
  126. package/lib/src/embed/sage.js.map +1 -1
  127. package/lib/src/embed/search.d.ts +1 -1
  128. package/lib/src/embed/search.d.ts.map +1 -1
  129. package/lib/src/embed/search.js +2 -3
  130. package/lib/src/embed/search.js.map +1 -1
  131. package/lib/src/embed/ts-embed.d.ts +0 -1
  132. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  133. package/lib/src/embed/ts-embed.js +13 -13
  134. package/lib/src/embed/ts-embed.js.map +1 -1
  135. package/lib/src/embed/ts-embed.spec.js +27 -26
  136. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  137. package/lib/src/index.d.ts +2 -2
  138. package/lib/src/index.d.ts.map +1 -1
  139. package/lib/src/index.js +2 -2
  140. package/lib/src/index.js.map +1 -1
  141. package/lib/src/mixpanel-service.d.ts.map +1 -1
  142. package/lib/src/mixpanel-service.js +2 -1
  143. package/lib/src/mixpanel-service.js.map +1 -1
  144. package/lib/src/react/index.spec.js +2 -2
  145. package/lib/src/react/index.spec.js.map +1 -1
  146. package/lib/src/types.d.ts +25 -1
  147. package/lib/src/types.d.ts.map +1 -1
  148. package/lib/src/types.js +11 -0
  149. package/lib/src/types.js.map +1 -1
  150. package/lib/src/utils/authService/authService.d.ts.map +1 -1
  151. package/lib/src/utils/authService/authService.js +3 -2
  152. package/lib/src/utils/authService/authService.js.map +1 -1
  153. package/lib/src/utils/authService/authService.spec.js +3 -2
  154. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  155. package/lib/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  156. package/lib/src/utils/authService/tokenizedAuthService.js +2 -1
  157. package/lib/src/utils/authService/tokenizedAuthService.js.map +1 -1
  158. package/lib/src/utils/logger.d.ts +18 -0
  159. package/lib/src/utils/logger.d.ts.map +1 -0
  160. package/lib/src/utils/logger.js +73 -0
  161. package/lib/src/utils/logger.js.map +1 -0
  162. package/lib/src/utils/logger.spec.d.ts +25 -0
  163. package/lib/src/utils/logger.spec.d.ts.map +1 -0
  164. package/lib/src/utils/logger.spec.js +57 -0
  165. package/lib/src/utils/logger.spec.js.map +1 -0
  166. package/lib/src/visual-embed-sdk.d.ts +29 -26
  167. package/package.json +1 -1
  168. package/src/auth.ts +5 -4
  169. package/src/embed/app.spec.ts +5 -4
  170. package/src/embed/app.ts +4 -3
  171. package/src/embed/base.spec.ts +3 -2
  172. package/src/embed/base.ts +10 -3
  173. package/src/embed/embed.spec.ts +2 -1
  174. package/src/embed/embedConfig.ts +2 -0
  175. package/src/embed/events.spec.ts +3 -2
  176. package/src/embed/liveboard.ts +4 -4
  177. package/src/embed/sage.ts +1 -1
  178. package/src/embed/search.ts +3 -4
  179. package/src/embed/ts-embed.spec.ts +27 -26
  180. package/src/embed/ts-embed.ts +19 -19
  181. package/src/index.ts +2 -0
  182. package/src/mixpanel-service.ts +2 -1
  183. package/src/react/index.spec.tsx +2 -2
  184. package/src/types.ts +26 -0
  185. package/src/utils/authService/authService.spec.ts +3 -2
  186. package/src/utils/authService/authService.ts +4 -2
  187. package/src/utils/authService/tokenizedAuthService.ts +2 -1
  188. package/src/utils/logger.spec.ts +67 -0
  189. package/src/utils/logger.ts +87 -0
@@ -32,6 +32,7 @@ import * as authInstance from '../auth';
32
32
  import * as baseInstance from './base';
33
33
  import { MIXPANEL_EVENT } from '../mixpanel-service';
34
34
  import * as authService from '../utils/authService/authService';
35
+ import { logger } from '../utils/logger';
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
  )
@@ -830,7 +831,7 @@ describe('Unit test case for ts embed', () => {
830
831
  const iFrame: any = document.createElement('div');
831
832
  iFrame.contentWindow = null;
832
833
  jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
833
- spyOn(console, 'error');
834
+ spyOn(logger, 'error');
834
835
  tsEmbed.render();
835
836
  });
836
837
 
@@ -844,7 +845,7 @@ describe('Unit test case for ts embed', () => {
844
845
 
845
846
  describe('when visible actions are set', () => {
846
847
  test('should throw error when there are both visible and hidden actions - pinboard', async () => {
847
- spyOn(console, 'error');
848
+ spyOn(logger, 'error');
848
849
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
849
850
  hiddenActions: [Action.DownloadAsCsv],
850
851
  visibleActions: [Action.DownloadAsCsv],
@@ -853,7 +854,7 @@ describe('Unit test case for ts embed', () => {
853
854
  } as LiveboardViewConfig);
854
855
  await pinboardEmbed.render();
855
856
  expect(pinboardEmbed['isError']).toBe(true);
856
- expect(console.error).toHaveBeenCalledWith(
857
+ expect(logger.error).toHaveBeenCalledWith(
857
858
  'You cannot have both hidden actions and visible actions',
858
859
  );
859
860
  });
@@ -876,7 +877,7 @@ describe('Unit test case for ts embed', () => {
876
877
  hiddenActions: Array<Action>,
877
878
  visibleActions: Array<Action>,
878
879
  ) {
879
- spyOn(console, 'error');
880
+ spyOn(logger, 'error');
880
881
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
881
882
  hiddenActions,
882
883
  visibleActions,
@@ -885,7 +886,7 @@ describe('Unit test case for ts embed', () => {
885
886
  } as LiveboardViewConfig);
886
887
  await liveboardEmbed.render();
887
888
  expect(liveboardEmbed['isError']).toBe(true);
888
- expect(console.error).toHaveBeenCalledWith(
889
+ expect(logger.error).toHaveBeenCalledWith(
889
890
  'You cannot have both hidden actions and visible actions',
890
891
  );
891
892
  }
@@ -921,7 +922,7 @@ describe('Unit test case for ts embed', () => {
921
922
 
922
923
  describe('when visible Tabs are set', () => {
923
924
  test('should throw error when there are both visible and hidden Tabs - pinboard', async () => {
924
- spyOn(console, 'error');
925
+ spyOn(logger, 'error');
925
926
  const pinboardEmbed = new PinboardEmbed(getRootEl(), {
926
927
  visibleTabs: [tabId1],
927
928
  hiddenTabs: [tabId2],
@@ -930,7 +931,7 @@ describe('Unit test case for ts embed', () => {
930
931
  } as LiveboardViewConfig);
931
932
  await pinboardEmbed.render();
932
933
  expect(pinboardEmbed['isError']).toBe(true);
933
- expect(console.error).toHaveBeenCalledWith(
934
+ expect(logger.error).toHaveBeenCalledWith(
934
935
  'You cannot have both hidden Tabs and visible Tabs',
935
936
  );
936
937
  });
@@ -953,7 +954,7 @@ describe('Unit test case for ts embed', () => {
953
954
  hiddenTabs: Array<string>,
954
955
  visibleTabs: Array<string>,
955
956
  ) {
956
- spyOn(console, 'error');
957
+ spyOn(logger, 'error');
957
958
  const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
958
959
  hiddenTabs,
959
960
  visibleTabs,
@@ -962,7 +963,7 @@ describe('Unit test case for ts embed', () => {
962
963
  } as LiveboardViewConfig);
963
964
  await liveboardEmbed.render();
964
965
  expect(liveboardEmbed['isError']).toBe(true);
965
- expect(console.error).toHaveBeenCalledWith(
966
+ expect(logger.error).toHaveBeenCalledWith(
966
967
  'You cannot have both hidden Tabs and visible Tabs',
967
968
  );
968
969
  }
@@ -1006,11 +1007,11 @@ describe('Unit test case for ts embed', () => {
1006
1007
  });
1007
1008
 
1008
1009
  test('Error should be true', async () => {
1009
- spyOn(console, 'error');
1010
+ spyOn(logger, 'error');
1010
1011
  const tsEmbed = new SearchEmbed(getRootEl(), {});
1011
1012
  tsEmbed.render();
1012
1013
  expect(tsEmbed['isError']).toBe(true);
1013
- expect(console.error).toHaveBeenCalledWith(
1014
+ expect(logger.error).toHaveBeenCalledWith(
1014
1015
  'You need to init the ThoughtSpot SDK module first',
1015
1016
  );
1016
1017
  });
@@ -1018,13 +1019,13 @@ describe('Unit test case for ts embed', () => {
1018
1019
 
1019
1020
  describe('V1Embed ', () => {
1020
1021
  test('when isRendered is true than isError will be true', () => {
1021
- spyOn(console, 'error');
1022
+ spyOn(logger, 'error');
1022
1023
  const viEmbedIns = new tsEmbedInstance.V1Embed(getRootEl(), defaultViewConfig);
1023
1024
  expect(viEmbedIns['isError']).toBe(false);
1024
1025
  viEmbedIns.render();
1025
1026
  viEmbedIns.on(EmbedEvent.CustomAction, jest.fn()).render();
1026
1027
  expect(viEmbedIns['isError']).toBe(true);
1027
- expect(console.error).toHaveBeenCalledWith(
1028
+ expect(logger.error).toHaveBeenCalledWith(
1028
1029
  'Please register event handlers before calling render',
1029
1030
  );
1030
1031
  });
@@ -1065,7 +1066,7 @@ describe('Unit test case for ts embed', () => {
1065
1066
  });
1066
1067
 
1067
1068
  test('navigateToPage function use before render', async () => {
1068
- spyOn(console, 'log');
1069
+ spyOn(logger, 'log');
1069
1070
  const appEmbed = new AppEmbed(getRootEl(), {
1070
1071
  frameParams: {
1071
1072
  width: '100%',
@@ -1074,7 +1075,7 @@ describe('Unit test case for ts embed', () => {
1074
1075
  });
1075
1076
  appEmbed.navigateToPage(path, false);
1076
1077
  await appEmbed.render();
1077
- expect(console.log).toHaveBeenCalledWith(
1078
+ expect(logger.log).toHaveBeenCalledWith(
1078
1079
  'Please call render before invoking this method',
1079
1080
  );
1080
1081
  });
@@ -1462,7 +1463,7 @@ describe('Unit test case for ts embed', () => {
1462
1463
  });
1463
1464
 
1464
1465
  // show preRender
1465
- const warnSpy = spyOn(console, 'warn');
1466
+ const warnSpy = spyOn(logger, 'warn');
1466
1467
  libEmbed.showPreRender();
1467
1468
  expect(warnSpy).toHaveBeenCalledTimes(0);
1468
1469
 
@@ -1492,13 +1493,13 @@ describe('Unit test case for ts embed', () => {
1492
1493
  it('preRender called without preRenderId should log error ', () => {
1493
1494
  createRootEleForEmbed();
1494
1495
 
1495
- spyOn(console, 'error');
1496
+ spyOn(logger, 'error');
1496
1497
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
1497
1498
  liveboardId: 'myLiveboardId',
1498
1499
  });
1499
1500
  libEmbed.preRender();
1500
1501
 
1501
- expect(console.error).toHaveBeenCalledWith('PreRender id is required for preRender');
1502
+ expect(logger.error).toHaveBeenCalledWith('PreRender id is required for preRender');
1502
1503
  });
1503
1504
 
1504
1505
  it('showPreRender should preRender if not available', async () => {
@@ -1546,7 +1547,7 @@ describe('Unit test case for ts embed', () => {
1546
1547
 
1547
1548
  libEmbed.preRender();
1548
1549
  await waitFor(() => !!getIFrameEl());
1549
- const warnSpy = jest.spyOn(console, 'warn');
1550
+ const warnSpy = jest.spyOn(logger, 'warn');
1550
1551
  const newEmbed = new LiveboardEmbed('#tsEmbedDiv', {
1551
1552
  preRenderId: 'i-am-preRendered',
1552
1553
  liveboardId: 'awdawda',
@@ -1565,10 +1566,10 @@ describe('Unit test case for ts embed', () => {
1565
1566
  liveboardId: 'myLiveboardId',
1566
1567
  });
1567
1568
  spyOn(libEmbed, 'preRender');
1568
- spyOn(console, 'error');
1569
+ spyOn(logger, 'error');
1569
1570
  libEmbed.showPreRender();
1570
1571
  expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
1571
- expect(console.error).toHaveBeenCalledTimes(1);
1572
+ expect(logger.error).toHaveBeenCalledTimes(1);
1572
1573
  });
1573
1574
 
1574
1575
  it('should get underlying iframe', async () => {
@@ -1596,16 +1597,16 @@ describe('Unit test case for ts embed', () => {
1596
1597
  );
1597
1598
  });
1598
1599
  it('should log error if sync is called before preRender', async () => {
1599
- jest.spyOn(console, 'error').mockImplementation(jest.fn());
1600
+ jest.spyOn(logger, 'error').mockImplementation(jest.fn());
1600
1601
  const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
1601
1602
  liveboardId: 'myLiveboardId',
1602
1603
  preRenderId: 'test',
1603
1604
  });
1604
1605
  await libEmbed.syncPreRenderStyle();
1605
- expect(console.error).toBeCalledWith(
1606
+ expect(logger.error).toBeCalledWith(
1606
1607
  'PreRender should be called before using syncPreRenderStyle',
1607
1608
  );
1608
- (console.error as any).mockClear();
1609
+ (logger.error as any).mockClear();
1609
1610
  });
1610
1611
  });
1611
1612
  });
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import isEqual from 'lodash/isEqual';
11
+ import { logger } from '../utils/logger';
11
12
  import { getAuthenticationToken } from '../authToken';
12
13
  import { AnswerService } from '../utils/graphql/answerService/answerService';
13
14
  import {
@@ -198,7 +199,7 @@ export class TsEmbed {
198
199
  error,
199
200
  });
200
201
  // Log error
201
- console.error(error);
202
+ logger.error(error);
202
203
  }
203
204
 
204
205
  /**
@@ -282,7 +283,7 @@ export class TsEmbed {
282
283
  this.executeCallbacks(EmbedEvent.Error, {
283
284
  offlineWarning,
284
285
  });
285
- console.warn(offlineWarning);
286
+ logger.warn(offlineWarning);
286
287
  };
287
288
  window.addEventListener('offline', offlineEventListener);
288
289
 
@@ -502,6 +503,9 @@ export class TsEmbed {
502
503
  queryParams[Param.ShowInsertToSlide] = insertInToSlide;
503
504
  }
504
505
 
506
+ queryParams[Param.OverrideNativeConsole] = true;
507
+ queryParams[Param.ClientLogLevel] = this.embedConfig.logLevel;
508
+
505
509
  return queryParams;
506
510
  }
507
511
 
@@ -952,10 +956,10 @@ export class TsEmbed {
952
956
  });
953
957
  } catch (e) {
954
958
  eventPort.postMessage({ error: e });
955
- console.log(e);
959
+ logger.log(e);
956
960
  }
957
961
  } else {
958
- console.log('Event Port is not defined');
962
+ logger.log('Event Port is not defined');
959
963
  }
960
964
  }
961
965
 
@@ -983,10 +987,6 @@ export class TsEmbed {
983
987
  return this;
984
988
  }
985
989
 
986
- public getIframeSrc(): string {
987
- return '';
988
- }
989
-
990
990
  protected handleRenderForPrerender() {
991
991
  this.render();
992
992
  }
@@ -998,7 +998,7 @@ export class TsEmbed {
998
998
  */
999
999
  public preRender(showPreRenderByDefault = false): TsEmbed {
1000
1000
  if (!this.viewConfig.preRenderId) {
1001
- console.error('PreRender id is required for preRender');
1001
+ logger.error('PreRender id is required for preRender');
1002
1002
  return this;
1003
1003
  }
1004
1004
  this.isPreRendered = true;
@@ -1047,7 +1047,7 @@ export class TsEmbed {
1047
1047
  this.insertedDomEl?.parentNode.removeChild(this.insertedDomEl);
1048
1048
  this.unsubscribeToEvents();
1049
1049
  } catch (e) {
1050
- console.log('Error destroying TS Embed', e);
1050
+ logger.log('Error destroying TS Embed', e);
1051
1051
  }
1052
1052
  }
1053
1053
 
@@ -1087,13 +1087,13 @@ export class TsEmbed {
1087
1087
  !isUndefined(viewConfig[key])
1088
1088
  && !isEqual(viewConfig[key], preRenderedObject.viewConfig[key])
1089
1089
  ) {
1090
- console.warn(
1090
+ logger.warn(
1091
1091
  `${this.embedComponentType} was pre-rendered with `
1092
- + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1093
- + `but a different value "${JSON.stringify(viewConfig[key])}" `
1094
- + 'was passed to the Embed component. '
1095
- + 'The new value provided is ignored, the value provided during '
1096
- + 'preRender is used.',
1092
+ + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1093
+ + `but a different value "${JSON.stringify(viewConfig[key])}" `
1094
+ + 'was passed to the Embed component. '
1095
+ + 'The new value provided is ignored, the value provided during '
1096
+ + 'preRender is used.',
1097
1097
  );
1098
1098
  }
1099
1099
  });
@@ -1108,7 +1108,7 @@ export class TsEmbed {
1108
1108
  */
1109
1109
  public showPreRender(): void {
1110
1110
  if (!this.viewConfig.preRenderId) {
1111
- console.error('PreRender id is required for preRender');
1111
+ logger.error('PreRender id is required for preRender');
1112
1112
  return;
1113
1113
  }
1114
1114
  if (!this.isPreRenderAvailable()) {
@@ -1157,7 +1157,7 @@ export class TsEmbed {
1157
1157
  */
1158
1158
  public syncPreRenderStyle(): void {
1159
1159
  if (!this.isPreRenderAvailable() || !this.el) {
1160
- console.error('PreRender should be called before using syncPreRenderStyle');
1160
+ logger.error('PreRender should be called before using syncPreRenderStyle');
1161
1161
  return;
1162
1162
  }
1163
1163
  const elBoundingClient = this.el.getBoundingClientRect();
@@ -1177,7 +1177,7 @@ export class TsEmbed {
1177
1177
  public hidePreRender(): void {
1178
1178
  if (!this.isPreRenderAvailable()) {
1179
1179
  // if the embed component is not preRendered , nothing to hide
1180
- console.warn('PreRender should be called before hiding it using hidePreRender.');
1180
+ logger.warn('PreRender should be called before hiding it using hidePreRender.');
1181
1181
  return;
1182
1182
  }
1183
1183
  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
  };
@@ -1,4 +1,5 @@
1
1
  import * as mixpanel from 'mixpanel-browser';
2
+ import { logger } from './utils/logger';
2
3
 
3
4
  export const EndPoints = {
4
5
  CONFIG: '/callosum/v1/system/config',
@@ -77,7 +78,7 @@ export function initMixpanel(sessionInfo: any): void {
77
78
  emptyQueue();
78
79
  }
79
80
  } catch (e) {
80
- console.error('Error initializing mixpanel', e);
81
+ logger.error('Error initializing mixpanel', e);
81
82
  }
82
83
  }
83
84
 
@@ -49,7 +49,7 @@ describe('React Components', () => {
49
49
  ),
50
50
  ).toBe(true);
51
51
  expect(getIFrameSrc(container)).toBe(
52
- `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
52
+ `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&overrideConsoleLogs=true&clientLogLevel=ERROR&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
53
53
  );
54
54
  });
55
55
 
@@ -222,7 +222,7 @@ describe('React Components', () => {
222
222
  ),
223
223
  ).toBe(true);
224
224
  expect(getIFrameSrc(container)).toBe(
225
- `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22]&dataSources=[%22test%22]&searchTokenString=%5Brevenue%5D&executeSearch=true&useLastSelectedSources=false&isSearchEmbed=true#/embed/search-bar-embed`,
225
+ `http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22]&overrideConsoleLogs=true&clientLogLevel=ERROR&dataSources=[%22test%22]&searchTokenString=%5Brevenue%5D&executeSearch=true&useLastSelectedSources=false&isSearchEmbed=true#/embed/search-bar-embed`,
226
226
  );
227
227
  });
228
228
  });
package/src/types.ts CHANGED
@@ -546,6 +546,21 @@ export interface EmbedConfig {
546
546
  * @version SDK: 1.26.2 | ThoughtSpot: *
547
547
  */
548
548
  suppressErrorAlerts?: boolean;
549
+
550
+ /**
551
+ * Log level for the SDK.
552
+ * @default LogLevel.ERROR
553
+ *
554
+ * @example
555
+ * ```js
556
+ * init({
557
+ * ...embedConfig,
558
+ * logLevel: LogLevel.SILENT
559
+ * })
560
+ * ```
561
+ * @version SDK: 1.26.3 | ThoughtSpot: 9.10.0.cl
562
+ */
563
+ logLevel?: LogLevel;
549
564
  }
550
565
 
551
566
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
@@ -2817,6 +2832,8 @@ export enum Param {
2817
2832
  HideSearchBarTitle = 'hideSearchBarTitle',
2818
2833
  HideSageAnswerHeader = 'hideSageAnswerHeader',
2819
2834
  HideSearchBar = 'hideSearchBar',
2835
+ ClientLogLevel = 'clientLogLevel',
2836
+ OverrideNativeConsole = 'overrideConsoleLogs',
2820
2837
  }
2821
2838
 
2822
2839
  /**
@@ -3745,3 +3762,12 @@ export interface CustomActionPayload {
3745
3762
  session: SessionInterface;
3746
3763
  vizId?: string;
3747
3764
  }
3765
+
3766
+ export enum LogLevel {
3767
+ SILENT = 'SILENT',
3768
+ ERROR = 'ERROR',
3769
+ WARN = 'WARN',
3770
+ INFO = 'INFO',
3771
+ DEBUG = 'DEBUG',
3772
+ TRACE = 'TRACE',
3773
+ }
@@ -7,6 +7,7 @@ import {
7
7
  verifyTokenService,
8
8
  EndPoints,
9
9
  } from '.';
10
+ import { logger } from '../logger';
10
11
 
11
12
  const thoughtSpotHost = 'http://10.79.135.124:3000';
12
13
 
@@ -74,14 +75,14 @@ describe('Unit test for authService', () => {
74
75
  });
75
76
 
76
77
  test('log error on API failures', async () => {
77
- jest.spyOn(global.console, 'error').mockImplementation(() => undefined);
78
+ jest.spyOn(logger, 'error').mockImplementation(() => undefined);
78
79
  global.fetch = jest.fn(() => Promise.resolve({
79
80
  text: () => Promise.resolve('error'),
80
81
  status: 500,
81
82
  ok: false,
82
83
  }));
83
84
  await fetchSessionInfoService(authVerificationUrl);
84
- expect(global.console.error).toHaveBeenCalledWith('Failure', 'error');
85
+ expect(logger.error).toHaveBeenCalledWith('Failure', 'error');
85
86
  });
86
87
 
87
88
  test('verifyTokenService', async () => {
@@ -1,3 +1,5 @@
1
+ import { logger } from '../logger';
2
+
1
3
  export const EndPoints = {
2
4
  AUTH_VERIFICATION: '/callosum/v1/session/info',
3
5
  SAML_LOGIN_TEMPLATE: (targetUrl: string) => `/callosum/v1/saml/login?targetURLPath=${targetUrl}`,
@@ -18,7 +20,7 @@ export const EndPoints = {
18
20
  function failureLoggedFetch(url: string, options: RequestInit = {}): Promise<Response> {
19
21
  return fetch(url, options).then(async (r) => {
20
22
  if (!r.ok && r.type !== 'opaqueredirect' && r.type !== 'opaque') {
21
- console.error('Failure', await r.text?.());
23
+ logger.error('Failure', await r.text?.());
22
24
  }
23
25
  return r;
24
26
  });
@@ -45,7 +47,7 @@ export async function verifyTokenService(
45
47
  });
46
48
  return res.ok;
47
49
  } catch (e) {
48
- console.error(`Token Verification Service failed : ${e.message}`);
50
+ logger.error(`Token Verification Service failed : ${e.message}`);
49
51
  }
50
52
 
51
53
  return false;
@@ -1,4 +1,5 @@
1
1
  import { tokenizedFetch } from '../../tokenizedFetch';
2
+ import { logger } from '../logger';
2
3
  import { EndPoints } from './authService';
3
4
 
4
5
  /**
@@ -9,7 +10,7 @@ import { EndPoints } from './authService';
9
10
  function tokenisedFailureLoggedFetch(url: string, options: RequestInit = {}): Promise<Response> {
10
11
  return tokenizedFetch(url, options).then(async (r) => {
11
12
  if (!r.ok && r.type !== 'opaqueredirect' && r.type !== 'opaque') {
12
- console.error('Failure', await r.text?.());
13
+ logger.error('Failure', await r.text?.());
13
14
  }
14
15
  return r;
15
16
  });
@@ -0,0 +1,67 @@
1
+ let logger: any;
2
+ let LogLevel: any;
3
+ let setGlobalLogLevelOverride: any;
4
+
5
+ const consoleErrorSpy = jest.spyOn(console, 'error');
6
+ const consoleWarnSpy = jest.spyOn(console, 'warn');
7
+ const consoleInfoSpy = jest.spyOn(console, 'info');
8
+ const consoleDebugSpy = jest.spyOn(console, 'debug');
9
+ const consoleTraceSpy = jest.spyOn(console, 'trace');
10
+
11
+ describe('Logger', () => {
12
+ beforeAll(async () => {
13
+ const a = await import('./logger');
14
+ logger = a.logger;
15
+ LogLevel = a.LogLevel;
16
+ setGlobalLogLevelOverride = a.setGlobalLogLevelOverride;
17
+ });
18
+
19
+ beforeEach(() => {
20
+ // Reset the logger's log level before each test
21
+ setGlobalLogLevelOverride(LogLevel.TRACE);
22
+ logger.setLogLevel(LogLevel.ERROR);
23
+
24
+ consoleErrorSpy.mockRestore();
25
+ consoleWarnSpy.mockRestore();
26
+ consoleInfoSpy.mockRestore();
27
+ consoleDebugSpy.mockRestore();
28
+ consoleTraceSpy.mockRestore();
29
+ });
30
+
31
+ it('should set the log level correctly', () => {
32
+ logger.setLogLevel(LogLevel.INFO);
33
+ expect(logger.getLogLevel()).toBe(LogLevel.INFO);
34
+
35
+ logger.setLogLevel(LogLevel.DEBUG);
36
+ expect(logger.getLogLevel()).toBe(LogLevel.DEBUG);
37
+ });
38
+
39
+ it('should log messages based on the log level', () => {
40
+ logger.setLogLevel(LogLevel.ERROR);
41
+ logger.error('Error message');
42
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
43
+
44
+ logger.warn('Warning message');
45
+ expect(consoleTraceSpy).not.toHaveBeenCalled();
46
+
47
+ logger.setLogLevel(LogLevel.WARN);
48
+ logger.error('Warning message');
49
+ logger.warn('Warning message');
50
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Warning message');
51
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Warning message');
52
+ });
53
+
54
+ it('should log messages with the global log level override', () => {
55
+ setGlobalLogLevelOverride(LogLevel.WARN);
56
+
57
+ logger.error('Error message');
58
+ logger.warn('Warn message');
59
+ logger.info('Info message');
60
+ logger.trace('Trace message');
61
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
62
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Warn message');
63
+ expect(consoleInfoSpy).not.toHaveBeenCalled();
64
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
65
+ expect(consoleTraceSpy).not.toHaveBeenCalled();
66
+ });
67
+ });
@@ -0,0 +1,87 @@
1
+ import { isUndefined, noop } from 'lodash';
2
+ import { LogLevel } from '../types';
3
+
4
+ const logFunctions: {
5
+ [key: string]: (...args: any[]) => void;
6
+ } = {
7
+ [LogLevel.SILENT]: noop,
8
+ [LogLevel.ERROR]: console.error,
9
+ [LogLevel.WARN]: console.warn,
10
+ [LogLevel.INFO]: console.info,
11
+ [LogLevel.DEBUG]: console.debug,
12
+ [LogLevel.TRACE]: console.trace,
13
+ };
14
+
15
+ let globalLogLevelOverride: LogLevel = LogLevel.TRACE;
16
+ const setGlobalLogLevelOverride = (logLevel: LogLevel): void => {
17
+ globalLogLevelOverride = logLevel;
18
+ };
19
+
20
+ const logLevelToNumber: { [key: string]: number } = {
21
+ [LogLevel.SILENT]: 0,
22
+ [LogLevel.ERROR]: 1,
23
+ [LogLevel.WARN]: 2,
24
+ [LogLevel.INFO]: 3,
25
+ [LogLevel.DEBUG]: 4,
26
+ [LogLevel.TRACE]: 5,
27
+ };
28
+ const compareLogLevels = (logLevel1: LogLevel, logLevel2: LogLevel): number => {
29
+ const logLevel1Index = logLevelToNumber[logLevel1];
30
+ const logLevel2Index = logLevelToNumber[logLevel2];
31
+ return logLevel1Index - logLevel2Index;
32
+ };
33
+
34
+ class Logger {
35
+ private logLevel: LogLevel = LogLevel.ERROR;
36
+
37
+ public setLogLevel = (newLogLevel: LogLevel): void => {
38
+ this.logLevel = newLogLevel;
39
+ };
40
+
41
+ public getLogLevel = (): LogLevel => this.logLevel;
42
+
43
+ public canLog(logLevel: LogLevel): boolean {
44
+ if (logLevel === LogLevel.SILENT) return false;
45
+ if (!isUndefined(globalLogLevelOverride)) {
46
+ return compareLogLevels(globalLogLevelOverride, logLevel) >= 0;
47
+ }
48
+ return compareLogLevels(this.logLevel, logLevel) >= 0;
49
+ }
50
+
51
+ public logMessages(args: any[], logLevel: LogLevel): void {
52
+ if (this.canLog(logLevel)) {
53
+ const logFn = logFunctions[logLevel];
54
+ if (logFn) {
55
+ logFn(...args);
56
+ }
57
+ }
58
+ }
59
+
60
+ public log(...args: any[]): void {
61
+ this.info(args);
62
+ }
63
+
64
+ public info(...args: any[]): void {
65
+ this.logMessages(args, LogLevel.INFO);
66
+ }
67
+
68
+ public debug(...args: any[]): void {
69
+ this.logMessages(args, LogLevel.DEBUG);
70
+ }
71
+
72
+ public trace(...args: any[]): void {
73
+ this.logMessages(args, LogLevel.TRACE);
74
+ }
75
+
76
+ public error(...args: any[]): void {
77
+ this.logMessages(args, LogLevel.ERROR);
78
+ }
79
+
80
+ public warn(...args: any[]): void {
81
+ this.logMessages(args, LogLevel.WARN);
82
+ }
83
+ }
84
+
85
+ const logger = new Logger();
86
+
87
+ export { LogLevel, logger, setGlobalLogLevelOverride };