@thoughtspot/visual-embed-sdk 1.27.0-alpha.3 → 1.27.0-alpha.4

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 (168) 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.map +1 -1
  6. package/cjs/src/embed/app.js +3 -2
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +5 -4
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/base.d.ts.map +1 -1
  11. package/cjs/src/embed/base.js +5 -2
  12. package/cjs/src/embed/base.js.map +1 -1
  13. package/cjs/src/embed/base.spec.js +3 -2
  14. package/cjs/src/embed/base.spec.js.map +1 -1
  15. package/cjs/src/embed/embed.spec.js +2 -1
  16. package/cjs/src/embed/embed.spec.js.map +1 -1
  17. package/cjs/src/embed/embedConfig.d.ts +2 -1
  18. package/cjs/src/embed/embedConfig.d.ts.map +1 -1
  19. package/cjs/src/embed/embedConfig.js +2 -0
  20. package/cjs/src/embed/embedConfig.js.map +1 -1
  21. package/cjs/src/embed/events.spec.js +3 -2
  22. package/cjs/src/embed/events.spec.js.map +1 -1
  23. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  24. package/cjs/src/embed/ts-embed.js +13 -10
  25. package/cjs/src/embed/ts-embed.js.map +1 -1
  26. package/cjs/src/embed/ts-embed.spec.js +27 -26
  27. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  28. package/cjs/src/index.d.ts +2 -2
  29. package/cjs/src/index.d.ts.map +1 -1
  30. package/cjs/src/index.js +2 -1
  31. package/cjs/src/index.js.map +1 -1
  32. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  33. package/cjs/src/mixpanel-service.js +2 -1
  34. package/cjs/src/mixpanel-service.js.map +1 -1
  35. package/cjs/src/react/index.d.ts +1 -1
  36. package/cjs/src/react/index.d.ts.map +1 -1
  37. package/cjs/src/react/index.js +2 -1
  38. package/cjs/src/react/index.js.map +1 -1
  39. package/cjs/src/react/index.spec.js +2 -2
  40. package/cjs/src/react/index.spec.js.map +1 -1
  41. package/cjs/src/types.d.ts +39 -9
  42. package/cjs/src/types.d.ts.map +1 -1
  43. package/cjs/src/types.js +26 -9
  44. package/cjs/src/types.js.map +1 -1
  45. package/cjs/src/utils/authService/authService.d.ts.map +1 -1
  46. package/cjs/src/utils/authService/authService.js +3 -2
  47. package/cjs/src/utils/authService/authService.js.map +1 -1
  48. package/cjs/src/utils/authService/authService.spec.js +3 -2
  49. package/cjs/src/utils/authService/authService.spec.js.map +1 -1
  50. package/cjs/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  51. package/cjs/src/utils/authService/tokenizedAuthService.js +2 -1
  52. package/cjs/src/utils/authService/tokenizedAuthService.js.map +1 -1
  53. package/cjs/src/utils/logger.d.ts +18 -0
  54. package/cjs/src/utils/logger.d.ts.map +1 -0
  55. package/cjs/src/utils/logger.js +80 -0
  56. package/cjs/src/utils/logger.js.map +1 -0
  57. package/cjs/src/utils/logger.spec.d.ts +25 -0
  58. package/cjs/src/utils/logger.spec.d.ts.map +1 -0
  59. package/cjs/src/utils/logger.spec.js +116 -0
  60. package/cjs/src/utils/logger.spec.js.map +1 -0
  61. package/dist/src/auth.d.ts.map +1 -1
  62. package/dist/src/embed/app.d.ts.map +1 -1
  63. package/dist/src/embed/base.d.ts.map +1 -1
  64. package/dist/src/embed/embedConfig.d.ts +2 -1
  65. package/dist/src/embed/embedConfig.d.ts.map +1 -1
  66. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  67. package/dist/src/index.d.ts +2 -2
  68. package/dist/src/index.d.ts.map +1 -1
  69. package/dist/src/mixpanel-service.d.ts.map +1 -1
  70. package/dist/src/react/index.d.ts +1 -1
  71. package/dist/src/react/index.d.ts.map +1 -1
  72. package/dist/src/types.d.ts +39 -9
  73. package/dist/src/types.d.ts.map +1 -1
  74. package/dist/src/utils/authService/authService.d.ts.map +1 -1
  75. package/dist/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  76. package/dist/src/utils/logger.d.ts +18 -0
  77. package/dist/src/utils/logger.d.ts.map +1 -0
  78. package/dist/src/utils/logger.spec.d.ts +25 -0
  79. package/dist/src/utils/logger.spec.d.ts.map +1 -0
  80. package/dist/tsembed-react.es.js +164 -54
  81. package/dist/tsembed-react.js +162 -53
  82. package/dist/tsembed.es.js +487 -371
  83. package/dist/tsembed.js +14957 -14842
  84. package/dist/visual-embed-sdk-react-full.d.ts +42 -11
  85. package/dist/visual-embed-sdk-react.d.ts +42 -11
  86. package/dist/visual-embed-sdk.d.ts +42 -11
  87. package/lib/package.json +1 -1
  88. package/lib/src/auth.d.ts.map +1 -1
  89. package/lib/src/auth.js +5 -4
  90. package/lib/src/auth.js.map +1 -1
  91. package/lib/src/embed/app.d.ts.map +1 -1
  92. package/lib/src/embed/app.js +3 -2
  93. package/lib/src/embed/app.js.map +1 -1
  94. package/lib/src/embed/app.spec.js +5 -4
  95. package/lib/src/embed/app.spec.js.map +1 -1
  96. package/lib/src/embed/base.d.ts.map +1 -1
  97. package/lib/src/embed/base.js +6 -3
  98. package/lib/src/embed/base.js.map +1 -1
  99. package/lib/src/embed/base.spec.js +3 -2
  100. package/lib/src/embed/base.spec.js.map +1 -1
  101. package/lib/src/embed/embed.spec.js +2 -1
  102. package/lib/src/embed/embed.spec.js.map +1 -1
  103. package/lib/src/embed/embedConfig.d.ts +2 -1
  104. package/lib/src/embed/embedConfig.d.ts.map +1 -1
  105. package/lib/src/embed/embedConfig.js +2 -0
  106. package/lib/src/embed/embedConfig.js.map +1 -1
  107. package/lib/src/embed/events.spec.js +3 -2
  108. package/lib/src/embed/events.spec.js.map +1 -1
  109. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  110. package/lib/src/embed/ts-embed.js +13 -10
  111. package/lib/src/embed/ts-embed.js.map +1 -1
  112. package/lib/src/embed/ts-embed.spec.js +27 -26
  113. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  114. package/lib/src/index.d.ts +2 -2
  115. package/lib/src/index.d.ts.map +1 -1
  116. package/lib/src/index.js +2 -2
  117. package/lib/src/index.js.map +1 -1
  118. package/lib/src/mixpanel-service.d.ts.map +1 -1
  119. package/lib/src/mixpanel-service.js +2 -1
  120. package/lib/src/mixpanel-service.js.map +1 -1
  121. package/lib/src/react/index.d.ts +1 -1
  122. package/lib/src/react/index.d.ts.map +1 -1
  123. package/lib/src/react/index.js +1 -1
  124. package/lib/src/react/index.js.map +1 -1
  125. package/lib/src/react/index.spec.js +2 -2
  126. package/lib/src/react/index.spec.js.map +1 -1
  127. package/lib/src/types.d.ts +39 -9
  128. package/lib/src/types.d.ts.map +1 -1
  129. package/lib/src/types.js +25 -8
  130. package/lib/src/types.js.map +1 -1
  131. package/lib/src/utils/authService/authService.d.ts.map +1 -1
  132. package/lib/src/utils/authService/authService.js +3 -2
  133. package/lib/src/utils/authService/authService.js.map +1 -1
  134. package/lib/src/utils/authService/authService.spec.js +3 -2
  135. package/lib/src/utils/authService/authService.spec.js.map +1 -1
  136. package/lib/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
  137. package/lib/src/utils/authService/tokenizedAuthService.js +2 -1
  138. package/lib/src/utils/authService/tokenizedAuthService.js.map +1 -1
  139. package/lib/src/utils/logger.d.ts +18 -0
  140. package/lib/src/utils/logger.d.ts.map +1 -0
  141. package/lib/src/utils/logger.js +74 -0
  142. package/lib/src/utils/logger.js.map +1 -0
  143. package/lib/src/utils/logger.spec.d.ts +25 -0
  144. package/lib/src/utils/logger.spec.d.ts.map +1 -0
  145. package/lib/src/utils/logger.spec.js +93 -0
  146. package/lib/src/utils/logger.spec.js.map +1 -0
  147. package/lib/src/visual-embed-sdk.d.ts +43 -12
  148. package/package.json +1 -1
  149. package/src/auth.ts +5 -4
  150. package/src/embed/app.spec.ts +5 -4
  151. package/src/embed/app.ts +3 -2
  152. package/src/embed/base.spec.ts +3 -2
  153. package/src/embed/base.ts +10 -3
  154. package/src/embed/embed.spec.ts +2 -1
  155. package/src/embed/embedConfig.ts +2 -0
  156. package/src/embed/events.spec.ts +3 -2
  157. package/src/embed/ts-embed.spec.ts +27 -26
  158. package/src/embed/ts-embed.ts +20 -16
  159. package/src/index.ts +2 -0
  160. package/src/mixpanel-service.ts +2 -1
  161. package/src/react/index.spec.tsx +2 -2
  162. package/src/react/index.tsx +1 -0
  163. package/src/types.ts +34 -2
  164. package/src/utils/authService/authService.spec.ts +3 -2
  165. package/src/utils/authService/authService.ts +4 -2
  166. package/src/utils/authService/tokenizedAuthService.ts +2 -1
  167. package/src/utils/logger.spec.ts +108 -0
  168. package/src/utils/logger.ts +88 -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 {
@@ -195,7 +196,7 @@ export class TsEmbed {
195
196
  error,
196
197
  });
197
198
  // Log error
198
- console.error(error);
199
+ logger.error(error);
199
200
  }
200
201
 
201
202
  /**
@@ -279,7 +280,7 @@ export class TsEmbed {
279
280
  this.executeCallbacks(EmbedEvent.Error, {
280
281
  offlineWarning,
281
282
  });
282
- console.warn(offlineWarning);
283
+ logger.warn(offlineWarning);
283
284
  };
284
285
  window.addEventListener('offline', offlineEventListener);
285
286
 
@@ -499,6 +500,9 @@ export class TsEmbed {
499
500
  queryParams[Param.ShowInsertToSlide] = insertInToSlide;
500
501
  }
501
502
 
503
+ queryParams[Param.OverrideNativeConsole] = true;
504
+ queryParams[Param.ClientLogLevel] = this.embedConfig.logLevel;
505
+
502
506
  return queryParams;
503
507
  }
504
508
 
@@ -949,10 +953,10 @@ export class TsEmbed {
949
953
  });
950
954
  } catch (e) {
951
955
  eventPort.postMessage({ error: e });
952
- console.log(e);
956
+ logger.log(e);
953
957
  }
954
958
  } else {
955
- console.log('Event Port is not defined');
959
+ logger.log('Event Port is not defined');
956
960
  }
957
961
  }
958
962
 
@@ -995,7 +999,7 @@ export class TsEmbed {
995
999
  */
996
1000
  public preRender(showPreRenderByDefault = false): TsEmbed {
997
1001
  if (!this.viewConfig.preRenderId) {
998
- console.error('PreRender id is required for preRender');
1002
+ logger.error('PreRender id is required for preRender');
999
1003
  return this;
1000
1004
  }
1001
1005
  this.isPreRendered = true;
@@ -1044,7 +1048,7 @@ export class TsEmbed {
1044
1048
  this.insertedDomEl?.parentNode.removeChild(this.insertedDomEl);
1045
1049
  this.unsubscribeToEvents();
1046
1050
  } catch (e) {
1047
- console.log('Error destroying TS Embed', e);
1051
+ logger.log('Error destroying TS Embed', e);
1048
1052
  }
1049
1053
  }
1050
1054
 
@@ -1084,13 +1088,13 @@ export class TsEmbed {
1084
1088
  !isUndefined(viewConfig[key])
1085
1089
  && !isEqual(viewConfig[key], preRenderedObject.viewConfig[key])
1086
1090
  ) {
1087
- console.warn(
1088
- 'TS Embed component was pre-rendered with '
1089
- + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1090
- + `but a different value "${JSON.stringify(viewConfig[key])}" `
1091
- + 'was passed to the Embed component. '
1092
- + 'The new value provided is ignored, the value provided during '
1093
- + 'preRender is used.',
1091
+ logger.warn(
1092
+ `${viewConfig.embedComponentType || 'Component'} was pre-rendered with `
1093
+ + `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
1094
+ + `but a different value "${JSON.stringify(viewConfig[key])}" `
1095
+ + 'was passed to the Embed component. '
1096
+ + 'The new value provided is ignored, the value provided during '
1097
+ + 'preRender is used.',
1094
1098
  );
1095
1099
  }
1096
1100
  });
@@ -1105,7 +1109,7 @@ export class TsEmbed {
1105
1109
  */
1106
1110
  public showPreRender(): void {
1107
1111
  if (!this.viewConfig.preRenderId) {
1108
- console.error('PreRender id is required for preRender');
1112
+ logger.error('PreRender id is required for preRender');
1109
1113
  return;
1110
1114
  }
1111
1115
  if (!this.isPreRenderAvailable()) {
@@ -1154,7 +1158,7 @@ export class TsEmbed {
1154
1158
  */
1155
1159
  public syncPreRenderStyle(): void {
1156
1160
  if (!this.isPreRenderAvailable() || !this.el) {
1157
- console.error('PreRender should be called before using syncPreRenderStyle');
1161
+ logger.error('PreRender should be called before using syncPreRenderStyle');
1158
1162
  return;
1159
1163
  }
1160
1164
  const elBoundingClient = this.el.getBoundingClientRect();
@@ -1174,7 +1178,7 @@ export class TsEmbed {
1174
1178
  public hidePreRender(): void {
1175
1179
  if (!this.isPreRenderAvailable()) {
1176
1180
  // if the embed component is not preRendered , nothing to hide
1177
- console.warn('PreRender should be called before hiding it using hidePreRender.');
1181
+ logger.warn('PreRender should be called before hiding it using hidePreRender.');
1178
1182
  return;
1179
1183
  }
1180
1184
  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
  });
@@ -380,4 +380,5 @@ export {
380
380
  FrameParams,
381
381
  HomeLeftNavItem,
382
382
  HomepageModule,
383
+ LogLevel,
383
384
  } from '../index';
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.5 | ThoughtSpot: 9.10.0.cl
562
+ */
563
+ logLevel?: LogLevel;
549
564
  }
550
565
 
551
566
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
@@ -1926,7 +1941,7 @@ export enum EmbedEvent {
1926
1941
  * @version SDK : 1.27.0 | Thoughtspot: 9.8.0.cl
1927
1942
  */
1928
1943
  CreateWorksheet = 'createWorksheet',
1929
- /**
1944
+ /**
1930
1945
  * Emitted when Ask Sage is initialized.
1931
1946
  *
1932
1947
  * @returns viewName: string
@@ -1935,7 +1950,13 @@ export enum EmbedEvent {
1935
1950
  * @returns isPublic: boolean
1936
1951
  * @version SDK : 1.29.0 | Thoughtspot: 9.12.0.cl
1937
1952
  */
1938
- AskSageInit = 'AskSageInit',
1953
+ AskSageInit = 'AskSageInit',
1954
+ /**
1955
+ * Emitted when a LB/viz is renamed
1956
+ *
1957
+ * @version SDK : 1.28.0 | ThoughtSpot: 9.11.0.cl
1958
+ */
1959
+ Rename = 'renameModalTitleDescription',
1939
1960
  }
1940
1961
 
1941
1962
  /**
@@ -2808,6 +2829,8 @@ export enum Param {
2808
2829
  HideSearchBarTitle = 'hideSearchBarTitle',
2809
2830
  HideSageAnswerHeader = 'hideSageAnswerHeader',
2810
2831
  HideSearchBar = 'hideSearchBar',
2832
+ ClientLogLevel = 'clientLogLevel',
2833
+ OverrideNativeConsole = 'overrideConsoleLogs',
2811
2834
  enableAskSage = 'enableAskSage',
2812
2835
  }
2813
2836
 
@@ -3748,3 +3771,12 @@ export interface CustomActionPayload {
3748
3771
  session: SessionInterface;
3749
3772
  vizId?: string;
3750
3773
  }
3774
+
3775
+ export enum LogLevel {
3776
+ SILENT = 'SILENT',
3777
+ ERROR = 'ERROR',
3778
+ WARN = 'WARN',
3779
+ INFO = 'INFO',
3780
+ DEBUG = 'DEBUG',
3781
+ TRACE = 'TRACE',
3782
+ }
@@ -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,108 @@
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
+ setGlobalLogLevelOverride(undefined);
41
+
42
+ logger.setLogLevel(LogLevel.SILENT);
43
+ logger.logMessages(['log me'], LogLevel.SILENT);
44
+ logger.error('Error message');
45
+ logger.warn('Warning message');
46
+ logger.debug('Debug message');
47
+ expect(consoleErrorSpy).not.toHaveBeenCalled();
48
+ expect(consoleWarnSpy).not.toHaveBeenCalled();
49
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
50
+
51
+ logger.setLogLevel(LogLevel.ERROR);
52
+ logger.error('Error message');
53
+ logger.warn('Warning message');
54
+ logger.debug('Debug message');
55
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
56
+ expect(consoleWarnSpy).not.toHaveBeenCalled();
57
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
58
+
59
+ logger.error('Warning message');
60
+ logger.warn('Warning message');
61
+ logger.debug('Debug message');
62
+ expect(consoleTraceSpy).not.toHaveBeenCalled();
63
+
64
+ logger.setLogLevel(LogLevel.WARN);
65
+ logger.error('Warning message');
66
+ logger.warn('Warning message');
67
+ logger.debug('Debug message');
68
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Warning message');
69
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Warning message');
70
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
71
+
72
+ logger.setLogLevel(LogLevel.DEBUG);
73
+ logger.error('Warning message');
74
+ logger.warn('Warning message');
75
+ logger.debug('Debug message');
76
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Warning message');
77
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Warning message');
78
+ expect(consoleDebugSpy).toHaveBeenCalledWith('Debug message');
79
+ });
80
+
81
+ it('should log messages with the global log level override', () => {
82
+ setGlobalLogLevelOverride(LogLevel.WARN);
83
+
84
+ logger.error('Error message');
85
+ logger.warn('Warn message');
86
+ logger.info('Info message');
87
+ logger.trace('Trace message');
88
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
89
+ expect(consoleWarnSpy).toHaveBeenCalledWith('Warn message');
90
+ expect(consoleInfoSpy).not.toHaveBeenCalled();
91
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
92
+ expect(consoleTraceSpy).not.toHaveBeenCalled();
93
+ });
94
+
95
+ it('If global level is not set , default local level (error) should be used', () => {
96
+ setGlobalLogLevelOverride(undefined);
97
+
98
+ logger.error('Error message');
99
+ logger.warn('Warn message');
100
+ logger.info('Info message');
101
+ logger.trace('Trace message');
102
+ expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
103
+ expect(consoleWarnSpy).not.toHaveBeenCalled();
104
+ expect(consoleInfoSpy).not.toHaveBeenCalled();
105
+ expect(consoleDebugSpy).not.toHaveBeenCalled();
106
+ expect(consoleTraceSpy).not.toHaveBeenCalled();
107
+ });
108
+ });