@thoughtspot/visual-embed-sdk 1.47.2 → 1.47.3

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 (144) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/embed/app.d.ts +6 -1
  3. package/cjs/src/embed/app.d.ts.map +1 -1
  4. package/cjs/src/embed/app.js +4 -1
  5. package/cjs/src/embed/app.js.map +1 -1
  6. package/cjs/src/embed/app.spec.js +112 -0
  7. package/cjs/src/embed/app.spec.js.map +1 -1
  8. package/cjs/src/embed/conversation.d.ts +2 -1
  9. package/cjs/src/embed/conversation.d.ts.map +1 -1
  10. package/cjs/src/embed/conversation.js.map +1 -1
  11. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  12. package/cjs/src/embed/liveboard.js +4 -1
  13. package/cjs/src/embed/liveboard.js.map +1 -1
  14. package/cjs/src/embed/liveboard.spec.js +22 -0
  15. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  16. package/cjs/src/embed/search.d.ts +24 -1
  17. package/cjs/src/embed/search.d.ts.map +1 -1
  18. package/cjs/src/embed/search.js +15 -2
  19. package/cjs/src/embed/search.js.map +1 -1
  20. package/cjs/src/embed/search.spec.js +99 -0
  21. package/cjs/src/embed/search.spec.js.map +1 -1
  22. package/cjs/src/embed/spotter-utils.d.ts +3 -0
  23. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  24. package/cjs/src/embed/spotter-utils.js +11 -3
  25. package/cjs/src/embed/spotter-utils.js.map +1 -1
  26. package/cjs/src/embed/spotter-utils.spec.js +51 -0
  27. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  28. package/cjs/src/embed/ts-embed.d.ts +1 -0
  29. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  30. package/cjs/src/embed/ts-embed.js +15 -3
  31. package/cjs/src/embed/ts-embed.js.map +1 -1
  32. package/cjs/src/embed/ts-embed.spec.js +139 -0
  33. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  34. package/cjs/src/index.d.ts +2 -2
  35. package/cjs/src/index.d.ts.map +1 -1
  36. package/cjs/src/index.js +8 -1
  37. package/cjs/src/index.js.map +1 -1
  38. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  39. package/cjs/src/mixpanel-service.js +2 -0
  40. package/cjs/src/mixpanel-service.js.map +1 -1
  41. package/cjs/src/mixpanel-service.spec.js +2 -0
  42. package/cjs/src/mixpanel-service.spec.js.map +1 -1
  43. package/cjs/src/test/test-utils.d.ts +1 -0
  44. package/cjs/src/test/test-utils.d.ts.map +1 -1
  45. package/cjs/src/test/test-utils.js +26 -1
  46. package/cjs/src/test/test-utils.js.map +1 -1
  47. package/cjs/src/types.d.ts +424 -0
  48. package/cjs/src/types.d.ts.map +1 -1
  49. package/cjs/src/types.js +121 -1
  50. package/cjs/src/types.js.map +1 -1
  51. package/dist/{index-CFZ7RDZ9.js → index-DZq20cR6.js} +1 -1
  52. package/dist/src/embed/app.d.ts +6 -1
  53. package/dist/src/embed/app.d.ts.map +1 -1
  54. package/dist/src/embed/conversation.d.ts +2 -1
  55. package/dist/src/embed/conversation.d.ts.map +1 -1
  56. package/dist/src/embed/liveboard.d.ts.map +1 -1
  57. package/dist/src/embed/search.d.ts +24 -1
  58. package/dist/src/embed/search.d.ts.map +1 -1
  59. package/dist/src/embed/spotter-utils.d.ts +3 -0
  60. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  61. package/dist/src/embed/ts-embed.d.ts +1 -0
  62. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  63. package/dist/src/index.d.ts +2 -2
  64. package/dist/src/index.d.ts.map +1 -1
  65. package/dist/src/mixpanel-service.d.ts.map +1 -1
  66. package/dist/src/test/test-utils.d.ts +1 -0
  67. package/dist/src/test/test-utils.d.ts.map +1 -1
  68. package/dist/src/types.d.ts +424 -0
  69. package/dist/src/types.d.ts.map +1 -1
  70. package/dist/tsembed-react.es.js +173 -13
  71. package/dist/tsembed-react.js +172 -12
  72. package/dist/tsembed.es.js +174 -14
  73. package/dist/tsembed.js +172 -12
  74. package/dist/visual-embed-sdk-react-full.d.ts +425 -0
  75. package/dist/visual-embed-sdk-react.d.ts +425 -0
  76. package/dist/visual-embed-sdk.d.ts +453 -0
  77. package/lib/package.json +1 -1
  78. package/lib/src/embed/app.d.ts +6 -1
  79. package/lib/src/embed/app.d.ts.map +1 -1
  80. package/lib/src/embed/app.js +4 -1
  81. package/lib/src/embed/app.js.map +1 -1
  82. package/lib/src/embed/app.spec.js +113 -1
  83. package/lib/src/embed/app.spec.js.map +1 -1
  84. package/lib/src/embed/conversation.d.ts +2 -1
  85. package/lib/src/embed/conversation.d.ts.map +1 -1
  86. package/lib/src/embed/conversation.js.map +1 -1
  87. package/lib/src/embed/liveboard.d.ts.map +1 -1
  88. package/lib/src/embed/liveboard.js +4 -1
  89. package/lib/src/embed/liveboard.js.map +1 -1
  90. package/lib/src/embed/liveboard.spec.js +22 -0
  91. package/lib/src/embed/liveboard.spec.js.map +1 -1
  92. package/lib/src/embed/search.d.ts +24 -1
  93. package/lib/src/embed/search.d.ts.map +1 -1
  94. package/lib/src/embed/search.js +15 -2
  95. package/lib/src/embed/search.js.map +1 -1
  96. package/lib/src/embed/search.spec.js +100 -1
  97. package/lib/src/embed/search.spec.js.map +1 -1
  98. package/lib/src/embed/spotter-utils.d.ts +3 -0
  99. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  100. package/lib/src/embed/spotter-utils.js +11 -3
  101. package/lib/src/embed/spotter-utils.js.map +1 -1
  102. package/lib/src/embed/spotter-utils.spec.js +51 -0
  103. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  104. package/lib/src/embed/ts-embed.d.ts +1 -0
  105. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  106. package/lib/src/embed/ts-embed.js +14 -2
  107. package/lib/src/embed/ts-embed.js.map +1 -1
  108. package/lib/src/embed/ts-embed.spec.js +139 -0
  109. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  110. package/lib/src/index.d.ts +2 -2
  111. package/lib/src/index.d.ts.map +1 -1
  112. package/lib/src/index.js +2 -2
  113. package/lib/src/index.js.map +1 -1
  114. package/lib/src/mixpanel-service.d.ts.map +1 -1
  115. package/lib/src/mixpanel-service.js +2 -0
  116. package/lib/src/mixpanel-service.js.map +1 -1
  117. package/lib/src/mixpanel-service.spec.js +2 -0
  118. package/lib/src/mixpanel-service.spec.js.map +1 -1
  119. package/lib/src/test/test-utils.d.ts +1 -0
  120. package/lib/src/test/test-utils.d.ts.map +1 -1
  121. package/lib/src/test/test-utils.js +25 -1
  122. package/lib/src/test/test-utils.js.map +1 -1
  123. package/lib/src/types.d.ts +424 -0
  124. package/lib/src/types.d.ts.map +1 -1
  125. package/lib/src/types.js +120 -0
  126. package/lib/src/types.js.map +1 -1
  127. package/lib/src/visual-embed-sdk.d.ts +453 -0
  128. package/package.json +1 -1
  129. package/src/embed/app.spec.ts +141 -0
  130. package/src/embed/app.ts +11 -0
  131. package/src/embed/conversation.ts +2 -1
  132. package/src/embed/liveboard.spec.ts +32 -0
  133. package/src/embed/liveboard.ts +5 -0
  134. package/src/embed/search.spec.ts +118 -0
  135. package/src/embed/search.ts +43 -1
  136. package/src/embed/spotter-utils.spec.ts +52 -0
  137. package/src/embed/spotter-utils.ts +19 -3
  138. package/src/embed/ts-embed.spec.ts +185 -0
  139. package/src/embed/ts-embed.ts +14 -3
  140. package/src/index.ts +16 -0
  141. package/src/mixpanel-service.spec.ts +2 -0
  142. package/src/mixpanel-service.ts +2 -0
  143. package/src/test/test-utils.ts +33 -1
  144. package/src/types.ts +454 -0
@@ -3648,5 +3648,144 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
3648
3648
  expect(iframe.allow).toContain('clipboard-read');
3649
3649
  expect(iframe.allow).toContain('clipboard-write');
3650
3650
  });
3651
+ describe('shouldSkipEvent', () => {
3652
+ beforeAll(() => {
3653
+ (0, index_1.init)({
3654
+ thoughtSpotHost: 'tshost',
3655
+ authType: index_1.AuthType.None,
3656
+ });
3657
+ });
3658
+ // Matches the structure produced by createValidationError / embedErrorDetails
3659
+ const makeNestedValidationData = (message = 'invalid payload') => ({
3660
+ type: index_1.EmbedEvent.Error,
3661
+ data: {
3662
+ errorType: 'VALIDATION_ERROR',
3663
+ message,
3664
+ code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3665
+ error: message,
3666
+ },
3667
+ });
3668
+ // Matches the flat structure where errorType sits at the top level of data
3669
+ const makeFlatValidationData = (message = 'invalid payload') => ({
3670
+ errorType: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3671
+ message,
3672
+ code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3673
+ });
3674
+ const makeEmbed = (viewConfig) => {
3675
+ const embed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), {
3676
+ ...defaultViewConfig,
3677
+ ...viewConfig,
3678
+ });
3679
+ return embed;
3680
+ };
3681
+ test('skips Error event and logs warning when useHostEventsV2 is true and shouldBypassPayloadValidation is true', () => {
3682
+ jest.spyOn(logger_1.logger, 'warn');
3683
+ const errorHandler = jest.fn();
3684
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3685
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3686
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3687
+ expect(errorHandler).not.toHaveBeenCalled();
3688
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: invalid payload');
3689
+ });
3690
+ test('skips Error event when errorType is resolved from data.data.code (nested format)', () => {
3691
+ jest.spyOn(logger_1.logger, 'warn');
3692
+ const errorHandler = jest.fn();
3693
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3694
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3695
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData('nested error'));
3696
+ expect(errorHandler).not.toHaveBeenCalled();
3697
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: nested error');
3698
+ });
3699
+ test('skips Error event when errorType is resolved from data.errorType (flat format)', () => {
3700
+ jest.spyOn(logger_1.logger, 'warn');
3701
+ const errorHandler = jest.fn();
3702
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3703
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3704
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeFlatValidationData());
3705
+ expect(errorHandler).not.toHaveBeenCalled();
3706
+ });
3707
+ test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is undefined', () => {
3708
+ const errorHandler = jest.fn();
3709
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: undefined });
3710
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3711
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3712
+ expect(errorHandler).toHaveBeenCalled();
3713
+ });
3714
+ test('delivers Error event to handler when useHostEventsV2 is true and shouldBypassPayloadValidation is false', () => {
3715
+ const errorHandler = jest.fn();
3716
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3717
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3718
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3719
+ expect(errorHandler).toHaveBeenCalled();
3720
+ });
3721
+ test('skips Error event when useHostEventsV2 is false regardless of shouldBypassPayloadValidation', () => {
3722
+ jest.spyOn(logger_1.logger, 'warn');
3723
+ const errorHandler = jest.fn();
3724
+ const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: undefined });
3725
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3726
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3727
+ expect(errorHandler).not.toHaveBeenCalled();
3728
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: invalid payload');
3729
+ });
3730
+ test('logs warning with undefined message when flat format has no nested data', () => {
3731
+ jest.spyOn(logger_1.logger, 'warn');
3732
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3733
+ embed.on(index_1.EmbedEvent.Error, jest.fn());
3734
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeFlatValidationData());
3735
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: undefined');
3736
+ });
3737
+ test('skips Error event when useHostEventsV2 is false and shouldBypassPayloadValidation is true', () => {
3738
+ jest.spyOn(logger_1.logger, 'warn');
3739
+ const errorHandler = jest.fn();
3740
+ const embed = makeEmbed({ useHostEventsV2: false, shouldBypassPayloadValidation: true });
3741
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3742
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3743
+ expect(errorHandler).not.toHaveBeenCalled();
3744
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: invalid payload');
3745
+ });
3746
+ test('skips via handleError when shouldBypassPayloadValidation is true', () => {
3747
+ jest.spyOn(logger_1.logger, 'warn');
3748
+ const errorHandler = jest.fn();
3749
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: true });
3750
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3751
+ embed.handleError({
3752
+ type: index_1.EmbedEvent.Error,
3753
+ data: {
3754
+ errorType: 'VALIDATION_ERROR',
3755
+ message: 'bad payload',
3756
+ code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION,
3757
+ error: 'bad payload',
3758
+ },
3759
+ });
3760
+ expect(errorHandler).not.toHaveBeenCalled();
3761
+ expect(logger_1.logger.warn).toHaveBeenCalledWith('Host Event Validation failed: bad payload');
3762
+ });
3763
+ test('delivers Error event to EmbedEvent.ALL handler when not skipped', () => {
3764
+ const allHandler = jest.fn();
3765
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3766
+ embed.on(index_1.EmbedEvent.ALL, allHandler);
3767
+ embed.executeCallbacks(index_1.EmbedEvent.Error, makeNestedValidationData());
3768
+ expect(allHandler).toHaveBeenCalled();
3769
+ });
3770
+ test('does not skip non-Error events even with HOST_EVENT_VALIDATION error code', () => {
3771
+ const customActionHandler = jest.fn();
3772
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3773
+ embed.on(index_1.EmbedEvent.CustomAction, customActionHandler);
3774
+ embed.executeCallbacks(index_1.EmbedEvent.CustomAction, {
3775
+ data: { code: types_1.EmbedErrorCodes.HOST_EVENT_VALIDATION },
3776
+ });
3777
+ expect(customActionHandler).toHaveBeenCalled();
3778
+ });
3779
+ test('does not skip Error events with unrelated error codes', () => {
3780
+ const errorHandler = jest.fn();
3781
+ const embed = makeEmbed({ useHostEventsV2: true, shouldBypassPayloadValidation: false });
3782
+ embed.on(index_1.EmbedEvent.Error, errorHandler);
3783
+ embed.executeCallbacks(index_1.EmbedEvent.Error, {
3784
+ errorType: 'SOME_OTHER_ERROR',
3785
+ message: 'something else failed',
3786
+ });
3787
+ expect(errorHandler).toHaveBeenCalled();
3788
+ });
3789
+ });
3651
3790
  });
3652
3791
  //# sourceMappingURL=ts-embed.spec.js.map