@thoughtspot/visual-embed-sdk 1.47.2 → 1.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/auth.d.ts.map +1 -1
  3. package/cjs/src/auth.js +11 -1
  4. package/cjs/src/auth.js.map +1 -1
  5. package/cjs/src/auth.spec.js +38 -0
  6. package/cjs/src/auth.spec.js.map +1 -1
  7. package/cjs/src/authToken.d.ts +2 -0
  8. package/cjs/src/authToken.d.ts.map +1 -1
  9. package/cjs/src/authToken.js +7 -5
  10. package/cjs/src/authToken.js.map +1 -1
  11. package/cjs/src/embed/app.d.ts +7 -2
  12. package/cjs/src/embed/app.d.ts.map +1 -1
  13. package/cjs/src/embed/app.js +4 -1
  14. package/cjs/src/embed/app.js.map +1 -1
  15. package/cjs/src/embed/app.spec.js +121 -0
  16. package/cjs/src/embed/app.spec.js.map +1 -1
  17. package/cjs/src/embed/conversation.d.ts +2 -1
  18. package/cjs/src/embed/conversation.d.ts.map +1 -1
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/liveboard.d.ts +1 -1
  21. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  22. package/cjs/src/embed/liveboard.js +4 -1
  23. package/cjs/src/embed/liveboard.js.map +1 -1
  24. package/cjs/src/embed/liveboard.spec.js +32 -0
  25. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  26. package/cjs/src/embed/search.d.ts +24 -1
  27. package/cjs/src/embed/search.d.ts.map +1 -1
  28. package/cjs/src/embed/search.js +15 -2
  29. package/cjs/src/embed/search.js.map +1 -1
  30. package/cjs/src/embed/search.spec.js +99 -0
  31. package/cjs/src/embed/search.spec.js.map +1 -1
  32. package/cjs/src/embed/spotter-utils.d.ts +3 -0
  33. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  34. package/cjs/src/embed/spotter-utils.js +11 -3
  35. package/cjs/src/embed/spotter-utils.js.map +1 -1
  36. package/cjs/src/embed/spotter-utils.spec.js +51 -0
  37. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  38. package/cjs/src/embed/ts-embed.d.ts +1 -0
  39. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  40. package/cjs/src/embed/ts-embed.js +17 -5
  41. package/cjs/src/embed/ts-embed.js.map +1 -1
  42. package/cjs/src/embed/ts-embed.spec.js +168 -0
  43. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  44. package/cjs/src/index.d.ts +2 -2
  45. package/cjs/src/index.d.ts.map +1 -1
  46. package/cjs/src/index.js +8 -1
  47. package/cjs/src/index.js.map +1 -1
  48. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  49. package/cjs/src/mixpanel-service.js +2 -0
  50. package/cjs/src/mixpanel-service.js.map +1 -1
  51. package/cjs/src/mixpanel-service.spec.js +2 -0
  52. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  53. package/cjs/src/test/test-utils.d.ts +1 -0
  54. package/cjs/src/test/test-utils.d.ts.map +1 -1
  55. package/cjs/src/test/test-utils.js +26 -1
  56. package/cjs/src/test/test-utils.js.map +1 -1
  57. package/cjs/src/tokenizedFetch.d.ts.map +1 -1
  58. package/cjs/src/tokenizedFetch.js +12 -9
  59. package/cjs/src/tokenizedFetch.js.map +1 -1
  60. package/cjs/src/tokenizedFetch.spec.d.ts +2 -0
  61. package/cjs/src/tokenizedFetch.spec.d.ts.map +1 -0
  62. package/cjs/src/tokenizedFetch.spec.js +68 -0
  63. package/cjs/src/tokenizedFetch.spec.js.map +1 -0
  64. package/cjs/src/types.d.ts +466 -13
  65. package/cjs/src/types.d.ts.map +1 -1
  66. package/cjs/src/types.js +149 -5
  67. package/cjs/src/types.js.map +1 -1
  68. package/dist/{index-CFZ7RDZ9.js → index-Ck-r09gt.js} +1 -1
  69. package/dist/src/auth.d.ts.map +1 -1
  70. package/dist/src/authToken.d.ts +2 -0
  71. package/dist/src/authToken.d.ts.map +1 -1
  72. package/dist/src/embed/app.d.ts +7 -2
  73. package/dist/src/embed/app.d.ts.map +1 -1
  74. package/dist/src/embed/conversation.d.ts +2 -1
  75. package/dist/src/embed/conversation.d.ts.map +1 -1
  76. package/dist/src/embed/liveboard.d.ts +1 -1
  77. package/dist/src/embed/liveboard.d.ts.map +1 -1
  78. package/dist/src/embed/search.d.ts +24 -1
  79. package/dist/src/embed/search.d.ts.map +1 -1
  80. package/dist/src/embed/spotter-utils.d.ts +3 -0
  81. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  82. package/dist/src/embed/ts-embed.d.ts +1 -0
  83. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  84. package/dist/src/index.d.ts +2 -2
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/mixpanel-service.d.ts.map +1 -1
  87. package/dist/src/test/test-utils.d.ts +1 -0
  88. package/dist/src/test/test-utils.d.ts.map +1 -1
  89. package/dist/src/tokenizedFetch.d.ts.map +1 -1
  90. package/dist/src/tokenizedFetch.spec.d.ts +2 -0
  91. package/dist/src/tokenizedFetch.spec.d.ts.map +1 -0
  92. package/dist/src/types.d.ts +466 -13
  93. package/dist/src/types.d.ts.map +1 -1
  94. package/dist/tsembed-react.es.js +226 -29
  95. package/dist/tsembed-react.js +225 -28
  96. package/dist/tsembed.es.js +227 -30
  97. package/dist/tsembed.js +225 -28
  98. package/dist/visual-embed-sdk-react-full.d.ts +469 -15
  99. package/dist/visual-embed-sdk-react.d.ts +469 -15
  100. package/dist/visual-embed-sdk.d.ts +497 -15
  101. package/lib/package.json +1 -1
  102. package/lib/src/auth.d.ts.map +1 -1
  103. package/lib/src/auth.js +12 -2
  104. package/lib/src/auth.js.map +1 -1
  105. package/lib/src/auth.spec.js +38 -0
  106. package/lib/src/auth.spec.js.map +1 -1
  107. package/lib/src/authToken.d.ts +2 -0
  108. package/lib/src/authToken.d.ts.map +1 -1
  109. package/lib/src/authToken.js +2 -2
  110. package/lib/src/authToken.js.map +1 -1
  111. package/lib/src/embed/app.d.ts +7 -2
  112. package/lib/src/embed/app.d.ts.map +1 -1
  113. package/lib/src/embed/app.js +4 -1
  114. package/lib/src/embed/app.js.map +1 -1
  115. package/lib/src/embed/app.spec.js +122 -1
  116. package/lib/src/embed/app.spec.js.map +1 -1
  117. package/lib/src/embed/conversation.d.ts +2 -1
  118. package/lib/src/embed/conversation.d.ts.map +1 -1
  119. package/lib/src/embed/conversation.js.map +1 -1
  120. package/lib/src/embed/liveboard.d.ts +1 -1
  121. package/lib/src/embed/liveboard.d.ts.map +1 -1
  122. package/lib/src/embed/liveboard.js +4 -1
  123. package/lib/src/embed/liveboard.js.map +1 -1
  124. package/lib/src/embed/liveboard.spec.js +32 -0
  125. package/lib/src/embed/liveboard.spec.js.map +1 -1
  126. package/lib/src/embed/search.d.ts +24 -1
  127. package/lib/src/embed/search.d.ts.map +1 -1
  128. package/lib/src/embed/search.js +15 -2
  129. package/lib/src/embed/search.js.map +1 -1
  130. package/lib/src/embed/search.spec.js +100 -1
  131. package/lib/src/embed/search.spec.js.map +1 -1
  132. package/lib/src/embed/spotter-utils.d.ts +3 -0
  133. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  134. package/lib/src/embed/spotter-utils.js +11 -3
  135. package/lib/src/embed/spotter-utils.js.map +1 -1
  136. package/lib/src/embed/spotter-utils.spec.js +51 -0
  137. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  138. package/lib/src/embed/ts-embed.d.ts +1 -0
  139. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  140. package/lib/src/embed/ts-embed.js +16 -4
  141. package/lib/src/embed/ts-embed.js.map +1 -1
  142. package/lib/src/embed/ts-embed.spec.js +168 -0
  143. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  144. package/lib/src/index.d.ts +2 -2
  145. package/lib/src/index.d.ts.map +1 -1
  146. package/lib/src/index.js +2 -2
  147. package/lib/src/index.js.map +1 -1
  148. package/lib/src/mixpanel-service.d.ts.map +1 -1
  149. package/lib/src/mixpanel-service.js +2 -0
  150. package/lib/src/mixpanel-service.js.map +1 -1
  151. package/lib/src/mixpanel-service.spec.js +2 -0
  152. package/lib/src/mixpanel-service.spec.js.map +1 -1
  153. package/lib/src/test/test-utils.d.ts +1 -0
  154. package/lib/src/test/test-utils.d.ts.map +1 -1
  155. package/lib/src/test/test-utils.js +25 -1
  156. package/lib/src/test/test-utils.js.map +1 -1
  157. package/lib/src/tokenizedFetch.d.ts.map +1 -1
  158. package/lib/src/tokenizedFetch.js +13 -10
  159. package/lib/src/tokenizedFetch.js.map +1 -1
  160. package/lib/src/tokenizedFetch.spec.d.ts +2 -0
  161. package/lib/src/tokenizedFetch.spec.d.ts.map +1 -0
  162. package/lib/src/tokenizedFetch.spec.js +65 -0
  163. package/lib/src/tokenizedFetch.spec.js.map +1 -0
  164. package/lib/src/types.d.ts +466 -13
  165. package/lib/src/types.d.ts.map +1 -1
  166. package/lib/src/types.js +148 -4
  167. package/lib/src/types.js.map +1 -1
  168. package/lib/src/visual-embed-sdk.d.ts +497 -15
  169. package/package.json +1 -1
  170. package/src/auth.spec.ts +55 -1
  171. package/src/auth.ts +11 -2
  172. package/src/authToken.ts +2 -2
  173. package/src/embed/app.spec.ts +154 -0
  174. package/src/embed/app.ts +13 -2
  175. package/src/embed/conversation.ts +2 -1
  176. package/src/embed/liveboard.spec.ts +46 -0
  177. package/src/embed/liveboard.ts +9 -4
  178. package/src/embed/search.spec.ts +118 -0
  179. package/src/embed/search.ts +43 -1
  180. package/src/embed/spotter-utils.spec.ts +52 -0
  181. package/src/embed/spotter-utils.ts +19 -3
  182. package/src/embed/ts-embed.spec.ts +220 -0
  183. package/src/embed/ts-embed.ts +15 -4
  184. package/src/index.ts +16 -0
  185. package/src/mixpanel-service.spec.ts +2 -0
  186. package/src/mixpanel-service.ts +2 -0
  187. package/src/test/test-utils.ts +33 -1
  188. package/src/tokenizedFetch.spec.ts +81 -0
  189. package/src/tokenizedFetch.ts +14 -11
  190. package/src/types.ts +496 -13
@@ -50,6 +50,7 @@ beforeAll(() => {
50
50
  const customisations = {
51
51
  style: {
52
52
  customCSS: {},
53
+ customCSSUrl: undefined,
53
54
  },
54
55
  content: {},
55
56
  };
@@ -82,6 +83,9 @@ const getMockAppInitPayload = (data) => {
82
83
  customVariablesForThirdPartyTools,
83
84
  interceptTimeout: undefined,
84
85
  interceptUrls: [],
86
+ shouldBypassPayloadValidation: undefined,
87
+ useHostEventsV2: undefined,
88
+ embedExpiryInAuthToken: true
85
89
  };
86
90
  return {
87
91
  type: index_1.EmbedEvent.APP_INIT,
@@ -520,6 +524,31 @@ describe('Unit test case for ts embed', () => {
520
524
  }));
521
525
  });
522
526
  });
527
+ test.each([
528
+ ['not set', undefined, true],
529
+ ['false', false, false],
530
+ ['true', true, true],
531
+ ])('embedExpiryInAuthToken is %s when refreshAuthTokenOnNearExpiry is %s', async (_label, refreshAuthTokenOnNearExpiry, expectedEmbedExpiry) => {
532
+ const mockEmbedEventPayload = {
533
+ type: index_1.EmbedEvent.APP_INIT,
534
+ data: {},
535
+ };
536
+ const searchEmbed = new index_1.AppEmbed((0, test_utils_1.getRootEl)(), {
537
+ ...defaultViewConfig,
538
+ refreshAuthTokenOnNearExpiry,
539
+ });
540
+ searchEmbed.render();
541
+ const mockPort = {
542
+ postMessage: jest.fn(),
543
+ };
544
+ await (0, test_utils_1.executeAfterWait)(() => {
545
+ const iframe = (0, test_utils_1.getIFrameEl)();
546
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
547
+ });
548
+ await (0, test_utils_1.executeAfterWait)(() => {
549
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({ embedExpiryInAuthToken: expectedEmbedExpiry }));
550
+ });
551
+ });
523
552
  test('when Embed event status have start status', (done) => {
524
553
  const mockEmbedEventPayload = {
525
554
  type: index_1.EmbedEvent.Save,
@@ -3648,5 +3677,144 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3648
3677
  expect(iframe.allow).toContain('clipboard-read');
3649
3678
  expect(iframe.allow).toContain('clipboard-write');
3650
3679
  });
3680
+ describe('shouldSkipEvent', () => {
3681
+ beforeAll(() => {
3682
+ (0, index_1.init)({
3683
+ thoughtSpotHost: 'tshost',
3684
+ authType: index_1.AuthType.None,
3685
+ });
3686
+ });
3687
+ // Matches the structure produced by createValidationError / embedErrorDetails
3688
+ const makeNestedValidationData = (message = 'invalid payload') => ({
3689
+ type: index_1.EmbedEvent.Error,
3690
+ data: {
3691
+ errorType: 'VALIDATION_ERROR',
3692
+ message,
3693
+ code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3694
+ error: message,
3695
+ },
3696
+ });
3697
+ // Matches the flat structure where errorType sits at the top level of data
3698
+ const makeFlatValidationData = (message = 'invalid payload') => ({
3699
+ errorType: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3700
+ message,
3701
+ code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3702
+ });
3703
+ const makeEmbed = (viewConfig) => {
3704
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
3705
+ ...defaultViewConfig,
3706
+ ...viewConfig,
3707
+ });
3708
+ return embed;
3709
+ };
3710
+ test('skips Error event and logs warning when useHostEventsV2 is true and shouldBypassPayloadValidation is true', () => {
3711
+ jest.spyOn(logger_1.logger, 'warn');
3712
+ const errorHandler = jest.fn();
3713
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3714
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3715
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3716
+ expect(errorHandler).not.toHaveBeenCalled();
3717
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: invalid payload');
3718
+ });
3719
+ test('skips Error event when errorType is resolved from data.data.code (nested format)', () => {
3720
+ jest.spyOn(logger_1.logger, 'warn');
3721
+ const errorHandler = jest.fn();
3722
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3723
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3724
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData('nested error'));
3725
+ expect(errorHandler).not.toHaveBeenCalled();
3726
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: nested error');
3727
+ });
3728
+ test('skips Error event when errorType is resolved from data.errorType (flat format)', () => {
3729
+ jest.spyOn(logger_1.logger, 'warn');
3730
+ const errorHandler = jest.fn();
3731
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3732
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3733
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeFlatValidationData());
3734
+ expect(errorHandler).not.toHaveBeenCalled();
3735
+ });
3736
+ test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is undefined', () => {
3737
+ const errorHandler = jest.fn();
3738
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: undefined });
3739
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3740
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3741
+ expect(errorHandler).toHaveBeenCalled();
3742
+ });
3743
+ test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is false', () => {
3744
+ const errorHandler = jest.fn();
3745
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3746
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3747
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3748
+ expect(errorHandler).toHaveBeenCalled();
3749
+ });
3750
+ test('skips Error event when useHostEventsV2 is false regardless of shouldBypassPayloadValidation', () => {
3751
+ jest.spyOn(logger_1.logger, 'warn');
3752
+ const errorHandler = jest.fn();
3753
+ const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: undefined });
3754
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3755
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3756
+ expect(errorHandler).not.toHaveBeenCalled();
3757
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: invalid payload');
3758
+ });
3759
+ test('logs warning with undefined message when flat format has no nested data', () => {
3760
+ jest.spyOn(logger_1.logger, 'warn');
3761
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3762
+ embed.on(index_1.EmbedEvent.Error, jest.fn());
3763
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeFlatValidationData());
3764
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: undefined');
3765
+ });
3766
+ test('skips Error event when useHostEventsV2 is false and shouldBypassPayloadValidation is true', () => {
3767
+ jest.spyOn(logger_1.logger, 'warn');
3768
+ const errorHandler = jest.fn();
3769
+ const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: true });
3770
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3771
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3772
+ expect(errorHandler).not.toHaveBeenCalled();
3773
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: invalid payload');
3774
+ });
3775
+ test('skips via handleError when shouldBypassPayloadValidation is true', () => {
3776
+ jest.spyOn(logger_1.logger, 'warn');
3777
+ const errorHandler = jest.fn();
3778
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3779
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3780
+ embed.handleError({
3781
+ type: index_1.EmbedEvent.Error,
3782
+ data: {
3783
+ errorType: 'VALIDATION_ERROR',
3784
+ message: 'bad payload',
3785
+ code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3786
+ error: 'bad payload',
3787
+ },
3788
+ });
3789
+ expect(errorHandler).not.toHaveBeenCalled();
3790
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: bad payload');
3791
+ });
3792
+ test('delivers Error event to EmbedEvent.ALL handler when not skipped', () => {
3793
+ const allHandler = jest.fn();
3794
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3795
+ embed.on(index_1.EmbedEvent.ALL, allHandler);
3796
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3797
+ expect(allHandler).toHaveBeenCalled();
3798
+ });
3799
+ test('does not skip non-Error events even with HOST_EVENT_VALIDATION error code', () => {
3800
+ const customActionHandler = jest.fn();
3801
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3802
+ embed.on(index_1.EmbedEvent.CustomAction, customActionHandler);
3803
+ embed.executeCallbacks(index_1.EmbedEvent.CustomAction, {
3804
+ data: { code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION },
3805
+ });
3806
+ expect(customActionHandler).toHaveBeenCalled();
3807
+ });
3808
+ test('does not skip Error events with unrelated error codes', () => {
3809
+ const errorHandler = jest.fn();
3810
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3811
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3812
+ embed.executeCallbacks(index_1.EmbedEvent.Error, {
3813
+ errorType: 'SOME_OTHER_ERROR',
3814
+ message: 'something else failed',
3815
+ });
3816
+ expect(errorHandler).toHaveBeenCalled();
3817
+ });
3818
+ });
3651
3819
  });
3652
3820
  //# sourceMappingURL=ts-embed.spec.js.map