@thoughtspot/visual-embed-sdk 1.32.0 → 1.32.2

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 (166) hide show
  1. package/cjs/package.json +4 -22
  2. package/cjs/src/auth.d.ts.map +1 -1
  3. package/cjs/src/auth.js +6 -5
  4. package/cjs/src/auth.js.map +1 -1
  5. package/cjs/src/authToken.d.ts.map +1 -1
  6. package/cjs/src/authToken.js +5 -7
  7. package/cjs/src/authToken.js.map +1 -1
  8. package/cjs/src/css-variables.d.ts +28 -0
  9. package/cjs/src/css-variables.d.ts.map +1 -1
  10. package/cjs/src/embed/app.d.ts +16 -14
  11. package/cjs/src/embed/app.d.ts.map +1 -1
  12. package/cjs/src/embed/app.js +19 -4
  13. package/cjs/src/embed/app.js.map +1 -1
  14. package/cjs/src/embed/app.spec.js +32 -0
  15. package/cjs/src/embed/app.spec.js.map +1 -1
  16. package/cjs/src/embed/base.d.ts.map +1 -1
  17. package/cjs/src/embed/base.js +2 -0
  18. package/cjs/src/embed/base.js.map +1 -1
  19. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  20. package/cjs/src/embed/liveboard.js +2 -1
  21. package/cjs/src/embed/liveboard.js.map +1 -1
  22. package/cjs/src/embed/liveboard.spec.js +10 -0
  23. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  24. package/cjs/src/embed/search.d.ts +14 -13
  25. package/cjs/src/embed/search.d.ts.map +1 -1
  26. package/cjs/src/embed/search.js +6 -4
  27. package/cjs/src/embed/search.js.map +1 -1
  28. package/cjs/src/embed/search.spec.js +9 -9
  29. package/cjs/src/embed/search.spec.js.map +1 -1
  30. package/cjs/src/embed/ts-embed.d.ts +1 -1
  31. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  32. package/cjs/src/embed/ts-embed.js +10 -6
  33. package/cjs/src/embed/ts-embed.js.map +1 -1
  34. package/cjs/src/errors.d.ts +11 -0
  35. package/cjs/src/errors.d.ts.map +1 -1
  36. package/cjs/src/errors.js +11 -0
  37. package/cjs/src/errors.js.map +1 -1
  38. package/cjs/src/mixpanel-service.d.ts +4 -0
  39. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  40. package/cjs/src/mixpanel-service.js +6 -1
  41. package/cjs/src/mixpanel-service.js.map +1 -1
  42. package/cjs/src/react/index.spec.js +1 -1
  43. package/cjs/src/react/index.spec.js.map +1 -1
  44. package/cjs/src/types.d.ts +178 -6
  45. package/cjs/src/types.d.ts.map +1 -1
  46. package/cjs/src/types.js +138 -3
  47. package/cjs/src/types.js.map +1 -1
  48. package/cjs/src/utils/processData.d.ts.map +1 -1
  49. package/cjs/src/utils/processData.js +2 -1
  50. package/cjs/src/utils/processData.js.map +1 -1
  51. package/cjs/src/utils/reporting.d.ts +16 -0
  52. package/cjs/src/utils/reporting.d.ts.map +1 -0
  53. package/cjs/src/utils/reporting.js +68 -0
  54. package/cjs/src/utils/reporting.js.map +1 -0
  55. package/cjs/src/utils/reporting.spec.d.ts +2 -0
  56. package/cjs/src/utils/reporting.spec.d.ts.map +1 -0
  57. package/cjs/src/utils/reporting.spec.js +76 -0
  58. package/cjs/src/utils/reporting.spec.js.map +1 -0
  59. package/dist/src/auth.d.ts.map +1 -1
  60. package/dist/src/authToken.d.ts.map +1 -1
  61. package/dist/src/css-variables.d.ts +28 -0
  62. package/dist/src/css-variables.d.ts.map +1 -1
  63. package/dist/src/embed/app.d.ts +16 -14
  64. package/dist/src/embed/app.d.ts.map +1 -1
  65. package/dist/src/embed/base.d.ts.map +1 -1
  66. package/dist/src/embed/liveboard.d.ts.map +1 -1
  67. package/dist/src/embed/search.d.ts +14 -13
  68. package/dist/src/embed/search.d.ts.map +1 -1
  69. package/dist/src/embed/ts-embed.d.ts +1 -1
  70. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  71. package/dist/src/errors.d.ts +11 -0
  72. package/dist/src/errors.d.ts.map +1 -1
  73. package/dist/src/mixpanel-service.d.ts +4 -0
  74. package/dist/src/mixpanel-service.d.ts.map +1 -1
  75. package/dist/src/types.d.ts +178 -6
  76. package/dist/src/types.d.ts.map +1 -1
  77. package/dist/src/utils/processData.d.ts.map +1 -1
  78. package/dist/src/utils/reporting.d.ts +16 -0
  79. package/dist/src/utils/reporting.d.ts.map +1 -0
  80. package/dist/src/utils/reporting.spec.d.ts +2 -0
  81. package/dist/src/utils/reporting.spec.d.ts.map +1 -0
  82. package/dist/tsembed-react.es.js +214 -39
  83. package/dist/tsembed-react.js +214 -39
  84. package/dist/tsembed.es.js +261 -40
  85. package/dist/tsembed.js +261 -40
  86. package/dist/visual-embed-sdk-react-full.d.ts +241 -34
  87. package/dist/visual-embed-sdk-react.d.ts +241 -34
  88. package/dist/visual-embed-sdk.d.ts +241 -34
  89. package/lib/package.json +4 -22
  90. package/lib/src/auth.d.ts.map +1 -1
  91. package/lib/src/auth.js +6 -5
  92. package/lib/src/auth.js.map +1 -1
  93. package/lib/src/authToken.d.ts.map +1 -1
  94. package/lib/src/authToken.js +5 -7
  95. package/lib/src/authToken.js.map +1 -1
  96. package/lib/src/css-variables.d.ts +28 -0
  97. package/lib/src/css-variables.d.ts.map +1 -1
  98. package/lib/src/embed/app.d.ts +16 -14
  99. package/lib/src/embed/app.d.ts.map +1 -1
  100. package/lib/src/embed/app.js +18 -3
  101. package/lib/src/embed/app.js.map +1 -1
  102. package/lib/src/embed/app.spec.js +33 -1
  103. package/lib/src/embed/app.spec.js.map +1 -1
  104. package/lib/src/embed/base.d.ts.map +1 -1
  105. package/lib/src/embed/base.js +2 -0
  106. package/lib/src/embed/base.js.map +1 -1
  107. package/lib/src/embed/liveboard.d.ts.map +1 -1
  108. package/lib/src/embed/liveboard.js +2 -1
  109. package/lib/src/embed/liveboard.js.map +1 -1
  110. package/lib/src/embed/liveboard.spec.js +10 -0
  111. package/lib/src/embed/liveboard.spec.js.map +1 -1
  112. package/lib/src/embed/search.d.ts +14 -13
  113. package/lib/src/embed/search.d.ts.map +1 -1
  114. package/lib/src/embed/search.js +6 -4
  115. package/lib/src/embed/search.js.map +1 -1
  116. package/lib/src/embed/search.spec.js +9 -9
  117. package/lib/src/embed/search.spec.js.map +1 -1
  118. package/lib/src/embed/ts-embed.d.ts +1 -1
  119. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  120. package/lib/src/embed/ts-embed.js +10 -6
  121. package/lib/src/embed/ts-embed.js.map +1 -1
  122. package/lib/src/errors.d.ts +11 -0
  123. package/lib/src/errors.d.ts.map +1 -1
  124. package/lib/src/errors.js +11 -0
  125. package/lib/src/errors.js.map +1 -1
  126. package/lib/src/mixpanel-service.d.ts +4 -0
  127. package/lib/src/mixpanel-service.d.ts.map +1 -1
  128. package/lib/src/mixpanel-service.js +6 -1
  129. package/lib/src/mixpanel-service.js.map +1 -1
  130. package/lib/src/react/index.spec.js +1 -1
  131. package/lib/src/react/index.spec.js.map +1 -1
  132. package/lib/src/types.d.ts +178 -6
  133. package/lib/src/types.d.ts.map +1 -1
  134. package/lib/src/types.js +138 -3
  135. package/lib/src/types.js.map +1 -1
  136. package/lib/src/utils/processData.d.ts.map +1 -1
  137. package/lib/src/utils/processData.js +2 -1
  138. package/lib/src/utils/processData.js.map +1 -1
  139. package/lib/src/utils/reporting.d.ts +16 -0
  140. package/lib/src/utils/reporting.d.ts.map +1 -0
  141. package/lib/src/utils/reporting.js +62 -0
  142. package/lib/src/utils/reporting.js.map +1 -0
  143. package/lib/src/utils/reporting.spec.d.ts +2 -0
  144. package/lib/src/utils/reporting.spec.d.ts.map +1 -0
  145. package/lib/src/utils/reporting.spec.js +74 -0
  146. package/lib/src/utils/reporting.spec.js.map +1 -0
  147. package/lib/src/visual-embed-sdk.d.ts +241 -34
  148. package/package.json +4 -22
  149. package/src/auth.ts +6 -5
  150. package/src/authToken.ts +5 -9
  151. package/src/css-variables.ts +28 -0
  152. package/src/embed/app.spec.ts +48 -0
  153. package/src/embed/app.ts +25 -15
  154. package/src/embed/base.ts +3 -1
  155. package/src/embed/liveboard.spec.ts +14 -0
  156. package/src/embed/liveboard.ts +2 -0
  157. package/src/embed/search.spec.ts +9 -9
  158. package/src/embed/search.ts +20 -16
  159. package/src/embed/ts-embed.ts +13 -6
  160. package/src/errors.ts +11 -0
  161. package/src/mixpanel-service.ts +6 -1
  162. package/src/react/index.spec.tsx +1 -1
  163. package/src/types.ts +192 -13
  164. package/src/utils/processData.ts +2 -3
  165. package/src/utils/reporting.spec.ts +91 -0
  166. package/src/utils/reporting.ts +71 -0
package/src/types.ts CHANGED
@@ -201,6 +201,10 @@ export enum HomeLeftNavItem {
201
201
  * @version SDK: 1.28.0| ThoughtSpot: 9.12.5.cl
202
202
  */
203
203
  SpotIQAnalysis = 'spotiq-analysis',
204
+ /**
205
+ * @version SDK: 1.34.0| ThoughtSpot: 10.3.0.cl
206
+ */
207
+ LiveboardSchedules = 'liveboard-schedules'
204
208
  }
205
209
  export type DOMSelector = string | HTMLElement;
206
210
 
@@ -588,7 +592,7 @@ export interface EmbedConfig {
588
592
  }
589
593
 
590
594
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
591
- export interface LayoutConfig { }
595
+ export interface LayoutConfig {}
592
596
 
593
597
  /**
594
598
  * Embedded iframe configuration
@@ -1012,6 +1016,43 @@ export interface ViewConfig {
1012
1016
  */
1013
1017
  // eslint-disable-next-line camelcase
1014
1018
  enableV2Shell_experimental?: boolean;
1019
+ /**
1020
+ * To set the initial state of the search bar in case of saved-answers.
1021
+ * @default true
1022
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
1023
+ * @example
1024
+ * ```js
1025
+ * const embed = new LiveboardEmbed('#embed', {
1026
+ * liveboardId: '123',
1027
+ * collapseSearchBar: true
1028
+ * });
1029
+ */
1030
+ collapseSearchBar?: boolean;
1031
+ /**
1032
+ * This flag can be used to disable links inside the embedded app,
1033
+ * and disables redirection of links in a new tab.
1034
+ * @example
1035
+ * ```js
1036
+ * const embed = new LiveboardEmbed('#embed', {
1037
+ * disableRedirectionLinksInNewTab: true
1038
+ * });
1039
+ * ```
1040
+ * @version SDK: 1.32.1 | ThoughtSpot: 10.3.0.cl
1041
+ */
1042
+ disableRedirectionLinksInNewTab?: boolean;
1043
+ /**
1044
+ * Flag to control Data panel experience
1045
+ * @default true
1046
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
1047
+ * @example
1048
+ * ```js
1049
+ * const embed = new AppEmbed('#tsEmbed', {
1050
+ * ... // other options
1051
+ * dataPanelV2: true,
1052
+ * })
1053
+ * ```
1054
+ */
1055
+ dataPanelV2?: boolean;
1015
1056
  }
1016
1057
 
1017
1058
  /**
@@ -2493,13 +2534,15 @@ export enum HostEvent {
2493
2534
  *
2494
2535
  * @example
2495
2536
  * ```js
2496
- * appEmbed.trigger(HostEvent.CreateMonitor)
2537
+ * searchEmbed.trigger(HostEvent.CreateMonitor)
2497
2538
  * ```
2498
2539
  * @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1.sw
2499
2540
  */
2500
2541
  CreateMonitor = 'createMonitor',
2501
2542
  /**
2502
- * Trigger the **Manage alerts** action on a visualization
2543
+ * Trigger the **Manage alerts** action on a KPI chart
2544
+ * in a visualization or saved Answer.
2545
+ *
2503
2546
  * @param - an object with `vizId` as a key
2504
2547
  * @example
2505
2548
  * ```js
@@ -2507,6 +2550,16 @@ export enum HostEvent {
2507
2550
  * vizId: '730496d6-6903-4601-937e-2c691821af3c'
2508
2551
  * })
2509
2552
  * ```
2553
+ *
2554
+ * @example
2555
+ * ```js
2556
+ * searchEmbed.trigger(HostEvent.ManageMonitor)
2557
+ * ```
2558
+ *
2559
+ * @example
2560
+ * ```js
2561
+ * vizEmbed.trigger(HostEvent.ManageMonitor)
2562
+ * ```
2510
2563
  * @version SDK: 1.15.0 | ThoughtSpot: 8.7.0.cl, 8.8.1.sw
2511
2564
  */
2512
2565
  ManageMonitor = 'manageMonitor',
@@ -3084,6 +3137,8 @@ export enum Param {
3084
3137
  IsFullAppEmbed = 'isFullAppEmbed',
3085
3138
  IsOnBeforeGetVizDataInterceptEnabled = 'isOnBeforeGetVizDataInterceptEnabled',
3086
3139
  FocusSearchBarOnRender = 'focusSearchBarOnRender',
3140
+ DisableRedirectionLinksInNewTab = 'disableRedirectionLinksInNewTab',
3141
+ HomePageSearchBarMode = 'homePageSearchBarMode',
3087
3142
  }
3088
3143
 
3089
3144
  /**
@@ -3234,6 +3289,7 @@ export enum Action {
3234
3289
  */
3235
3290
  ConfigureFilter = 'configureFilter',
3236
3291
  CollapseDataSources = 'collapseDataSources',
3292
+ CollapseDataPanel = 'collapseDataPanel',
3237
3293
  /**
3238
3294
  * The **Choose sources** button on Search page.
3239
3295
  * Allows selecting data sources for search queries.
@@ -3630,12 +3686,15 @@ export enum Action {
3630
3686
  * The Create alert action on KPI charts.
3631
3687
  * @example
3632
3688
  * ```js
3633
- * disabledActions: [Action.CreateMonitor ]
3689
+ * disabledActions: [Action.CreateMonitor]
3634
3690
  * ```
3635
3691
  * @version SDK: 1.11.0 | ThoughtSpot: 8.3.0.cl, 8.4.1.sw
3636
3692
  */
3637
3693
  CreateMonitor = 'createMonitor',
3638
3694
  /**
3695
+ * @deprecated
3696
+ * Reports errors
3697
+ *
3639
3698
  * @example
3640
3699
  * ```js
3641
3700
  * disabledActions: [Action.ReportError]
@@ -3860,35 +3919,84 @@ export enum Action {
3860
3919
  */
3861
3920
  RenameModalTitleDescription = 'renameModalTitleDescription',
3862
3921
  /**
3922
+ *
3923
+ * @example
3924
+ * ```js
3925
+ * disabledActions: [Action.RequestVerification]
3926
+ * ```
3863
3927
  *
3864
3928
  * @version SDK: 1.25.0 | Thoughtspot: 9.6.0.cl
3865
3929
  */
3866
3930
  RequestVerification = 'requestVerification',
3867
3931
  /**
3932
+ *
3933
+ * Allows users to mark a Liveboard as verified.
3934
+ *
3935
+ * @example
3936
+ * ```js
3937
+ * disabledActions: [Action.MarkAsVerified]
3938
+ * ```
3868
3939
  * @version SDK: 1.25.0 | Thoughtspot: 9.6.0.cl
3869
3940
  */
3870
3941
  MarkAsVerified = 'markAsVerified',
3871
3942
  /**
3943
+ * The **Add Tab** action on a Liveboard.
3944
+ * Allows adding a new tab to a Liveboard view.
3945
+ *
3946
+ * @example
3947
+ * ```js
3948
+ * disabledActions: [Action.AddTab]
3949
+ * ```
3872
3950
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
3873
3951
  */
3874
3952
  AddTab = 'addTab',
3875
3953
  /**
3954
+ *
3955
+ * Initiates contextual change analysis on KPI charts.
3956
+ *
3957
+ * @example
3958
+ * ```js
3959
+ * disabledActions: [Action.EnableContextualChangeAnalysis]
3960
+ * ```
3876
3961
  * @version SDK: 1.25.0 | Thoughtspot: 9.6.0.cl
3877
3962
  */
3878
3963
  EnableContextualChangeAnalysis = 'enableContextualChangeAnalysis',
3879
3964
  /**
3965
+ *
3966
+ * @example
3967
+ * ```js
3968
+ * disabledActions: [Action.ShowSageQuery]
3969
+ * ```
3970
+ *
3880
3971
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
3881
3972
  */
3882
3973
  ShowSageQuery = 'showSageQuery',
3883
3974
  /**
3975
+ *
3976
+ * @example
3977
+ * ```js
3978
+ * disabledActions: [Action.EditSageAnswer]
3979
+ * ```
3884
3980
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
3885
3981
  */
3886
3982
  EditSageAnswer = 'editSageAnswer',
3887
3983
  /**
3984
+ *
3985
+ * This action allows users to send feedback on AI-generated Answers.
3986
+ *
3987
+ * @example
3988
+ * ```js
3989
+ * disabledActions: [Action.SageAnswerFeedback]
3990
+ * ```
3888
3991
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
3889
3992
  */
3890
3993
  SageAnswerFeedback = 'sageAnswerFeedback',
3891
3994
  /**
3995
+ *
3996
+ * @example
3997
+ * ```js
3998
+ * disabledActions: [Action.ModifySageAnswer]
3999
+ * ```
3892
4000
  * @version SDK: 1.26.0 | Thoughtspot: 9.7.0.cl
3893
4001
  */
3894
4002
  ModifySageAnswer = 'modifySageAnswer',
@@ -4018,6 +4126,77 @@ export enum Action {
4018
4126
  * @version SDK: 1.27.10 | Thoughtspot: 9.12.5.cl
4019
4127
  */
4020
4128
  AIHighlights = 'AIHighlights',
4129
+
4130
+ /**
4131
+ * Action ID for edit schedule action on schedule on homepage
4132
+ * @example
4133
+ * ```js
4134
+ * disabledActions: [Action.EditScheduleHomepage]
4135
+ * ```
4136
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
4137
+ */
4138
+ EditScheduleHomepage = 'editScheduleHomepage',
4139
+
4140
+ /**
4141
+ * Action ID for pause schedule action on schedule on homepage
4142
+ * @example
4143
+ * ```js
4144
+ * disabledActions: [Action.PauseScheduleHomepage]
4145
+ * ```
4146
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
4147
+ */
4148
+ PauseScheduleHomepage = 'pauseScheduleHomepage',
4149
+
4150
+ /**
4151
+ * Action ID for view schedule run action on schedule on homepage
4152
+ * @example
4153
+ * ```js
4154
+ * disabledActions: [Action.ViewScheduleRunHomepage]
4155
+ * ```
4156
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
4157
+ */
4158
+ ViewScheduleRunHomepage = 'viewScheduleRunHomepage',
4159
+
4160
+ /**
4161
+ * Action ID for unsubscribe schedule action on schedule on homepage
4162
+ * @example
4163
+ * ```js
4164
+ * disabledActions: [Action.UnsubscribeScheduleHomepage]
4165
+ * ```
4166
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
4167
+ */
4168
+ UnsubscribeScheduleHomepage = 'unsubscribeScheduleHomepage',
4169
+
4170
+ /**
4171
+ * The **Manage Tags** action on Homepage Favourite Module.
4172
+ *
4173
+ * @example
4174
+ * ```js
4175
+ * disabledActions: [Action.ManageTags]
4176
+ * ```
4177
+ * @version SDK : 1.34.0 | Thoughtspot: 10.3.0.cl
4178
+ */
4179
+ ManageTags = 'manageTags',
4180
+
4181
+ /**
4182
+ * Action ID for delete schedule action on schedule on homepage
4183
+ * @example
4184
+ * ```js
4185
+ * disabledActions: [Action.DeleteScheduleHomepage]
4186
+ * ```
4187
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
4188
+ */
4189
+ DeleteScheduleHomepage = 'deleteScheduleHomepage',
4190
+
4191
+ /**
4192
+ * The **Analyze CTA** action on KPI chart.
4193
+ * @example
4194
+ * ```js
4195
+ * disabledActions: [Action.KPIAnalysisCTA]
4196
+ * ```
4197
+ * @version SDK: 1.34.0 | Thoughtspot: 10.3.0.cl
4198
+ */
4199
+ KPIAnalysisCTA = 'kpiAnalysisCTA',
4021
4200
  }
4022
4201
 
4023
4202
  export interface AnswerServiceType {
@@ -4047,15 +4226,15 @@ export interface ColumnValue {
4047
4226
  [key: string]: any;
4048
4227
  };
4049
4228
  value:
4050
- | string
4051
- | number
4052
- | boolean
4053
- | {
4054
- v: {
4055
- s: number;
4056
- e: number;
4057
- };
4058
- };
4229
+ | string
4230
+ | number
4231
+ | boolean
4232
+ | {
4233
+ v: {
4234
+ s: number;
4235
+ e: number;
4236
+ };
4237
+ };
4059
4238
  }
4060
4239
 
4061
4240
  export interface VizPoint {
@@ -9,6 +9,7 @@ import { AuthFailureType } from '../auth';
9
9
  import { AuthType, CustomActionPayload, EmbedEvent } from '../types';
10
10
  import { AnswerService } from './graphql/answerService/answerService';
11
11
  import { resetCachedAuthToken } from '../authToken';
12
+ import { ERROR_MESSAGE } from '../errors';
12
13
 
13
14
  /**
14
15
  *
@@ -62,9 +63,7 @@ function processNoCookieAccess(e: any, containerEl: Element) {
62
63
  if (!ignoreNoCookieAccess) {
63
64
  if (!suppressNoCookieAccessAlert && !suppressErrorAlerts) {
64
65
  // eslint-disable-next-line no-alert
65
- alert(
66
- 'Third party cookie access is blocked on this browser, please allow third party cookies for this to work properly. \nYou can use `suppressNoCookieAccessAlert` to suppress this message.',
67
- );
66
+ alert(ERROR_MESSAGE.THIRD_PARTY_COOKIE_BLOCKED_ALERT);
68
67
  }
69
68
  // eslint-disable-next-line no-param-reassign
70
69
  containerEl.innerHTML = loginFailedMessage;
@@ -0,0 +1,91 @@
1
+ import { setEmbedConfig } from '../embed/embedConfig';
2
+ import { registerReportingObserver, getGlobalReportingObserver, resetGlobalReportingObserver } from './reporting';
3
+ import { logger } from './logger';
4
+ import { AuthType } from '../types';
5
+ import { ERROR_MESSAGE } from '../errors';
6
+
7
+ jest.mock('./logger');
8
+
9
+ describe('ReportingObserver', () => {
10
+ let mockReportingObserver: jest.Mock;
11
+
12
+ beforeAll(() => {
13
+ // Mock the ReportingObserver
14
+ mockReportingObserver = jest.fn().mockImplementation((callback: any, options: any) => ({
15
+ observe: jest.fn(),
16
+ disconnect: jest.fn(),
17
+ takeRecords: jest.fn(),
18
+ }));
19
+ (window as any).ReportingObserver = mockReportingObserver;
20
+ });
21
+
22
+ afterEach(() => {
23
+ jest.clearAllMocks();
24
+ resetGlobalReportingObserver();
25
+ });
26
+
27
+ test('should warn if ReportingObserver is not supported', () => {
28
+ (window as any).ReportingObserver = undefined;
29
+ const observer = registerReportingObserver();
30
+ expect(observer).toBeNull();
31
+ expect(logger.warn).toHaveBeenCalledWith('ReportingObserver not supported');
32
+ (window as any).ReportingObserver = mockReportingObserver;
33
+ });
34
+
35
+ test('should return existing globalObserver if override is false', () => {
36
+ const firstObserver = registerReportingObserver();
37
+ const secondObserver = registerReportingObserver();
38
+ expect(firstObserver === secondObserver).toBe(true);
39
+ });
40
+
41
+ test('should override existing globalObserver if override is true', () => {
42
+ const firstObserver = registerReportingObserver();
43
+ const secondObserver = registerReportingObserver(true);
44
+ expect(firstObserver).not.toBe(secondObserver);
45
+ });
46
+
47
+ test('should return globalObserver', () => {
48
+ const observer = registerReportingObserver();
49
+ const globalObserver = getGlobalReportingObserver();
50
+ expect(globalObserver).toBe(observer);
51
+ });
52
+
53
+ test('Should register a global observer with callback', () => {
54
+ let callBackPassed: any;
55
+
56
+ // Mock the ReportingObserver
57
+ const NewMockRO = jest.fn().mockImplementation((callback: any, options: any) => {
58
+ callBackPassed = callback;
59
+ return ({
60
+ observe: jest.fn(),
61
+ disconnect: jest.fn(),
62
+ takeRecords: jest.fn(),
63
+ });
64
+ });
65
+ const currentObserver = (window as any).ReportingObserver;
66
+ (window as any).ReportingObserver = NewMockRO;
67
+
68
+ setEmbedConfig({
69
+ thoughtSpotHost: 'testHost',
70
+ authType: AuthType.None,
71
+ });
72
+
73
+ const mockAlert = jest.fn();
74
+ window.alert = mockAlert;
75
+
76
+ const observer = registerReportingObserver();
77
+ expect(observer).toBeDefined();
78
+ expect(NewMockRO).toHaveBeenCalled();
79
+ expect(callBackPassed).toBeDefined();
80
+
81
+ // call the callback
82
+ callBackPassed([{ type: 'csp-violation', url: 'testHost', body: { effectiveDirective: 'frame-ancestors' } }]);
83
+
84
+ expect(mockAlert).toHaveBeenCalledWith(ERROR_MESSAGE.CSP_VIOLATION_ALERT);
85
+ expect(logger.error).toHaveBeenCalledWith(
86
+ ERROR_MESSAGE.CSP_FRAME_HOST_VIOLATION_LOG_MESSAGE,
87
+ );
88
+
89
+ (window as any).ReportingObserver = currentObserver;
90
+ });
91
+ });
@@ -0,0 +1,71 @@
1
+ import { getEmbedConfig } from '../embed/embedConfig';
2
+ import { logger } from './logger';
3
+ import { ERROR_MESSAGE } from '../errors';
4
+
5
+ enum ReportType {
6
+ CSP_VIOLATION = 'csp-violation',
7
+ DEPRECATION = 'deprecation',
8
+ INTERVENTION = 'intervention',
9
+ }
10
+
11
+ let globalObserver: ReportingObserver | null = null;
12
+
13
+ /**
14
+ * Register a global ReportingObserver to capture all unhandled errors
15
+ * @param overrideExisting boolean to override existing observer
16
+ * @returns ReportingObserver | null
17
+ */
18
+ export function registerReportingObserver(overrideExisting = false): ReportingObserver | null {
19
+ if (!((window as any).ReportingObserver)) {
20
+ logger.warn(ERROR_MESSAGE.MISSING_REPORTING_OBSERVER);
21
+ return null;
22
+ }
23
+
24
+ if (overrideExisting) {
25
+ resetGlobalReportingObserver();
26
+ }
27
+
28
+ if (globalObserver) {
29
+ return globalObserver;
30
+ }
31
+
32
+ const embedConfig = getEmbedConfig();
33
+
34
+ globalObserver = new ReportingObserver((reports) => {
35
+ reports.forEach((report) => {
36
+ const { type, url, body } = report;
37
+ const reportBody = body as any;
38
+
39
+ const isThoughtSpotHost = url
40
+ && url.startsWith(embedConfig.thoughtSpotHost);
41
+
42
+ const isFrameHostError = type === ReportType.CSP_VIOLATION
43
+ && reportBody.effectiveDirective === 'frame-ancestors';
44
+
45
+ if (isThoughtSpotHost && isFrameHostError) {
46
+ if (!embedConfig.suppressErrorAlerts) {
47
+ alert(ERROR_MESSAGE.CSP_VIOLATION_ALERT);
48
+ }
49
+ logger.error(ERROR_MESSAGE.CSP_FRAME_HOST_VIOLATION_LOG_MESSAGE);
50
+ }
51
+ });
52
+ }, { buffered: true });
53
+ globalObserver.observe();
54
+ return globalObserver;
55
+ }
56
+
57
+ /**
58
+ * Get the global ReportingObserver
59
+ * @returns - ReportingObserver | null
60
+ */
61
+ export function getGlobalReportingObserver(): ReportingObserver | null {
62
+ return globalObserver;
63
+ }
64
+
65
+ /**
66
+ * Resets the global ReportingObserver
67
+ */
68
+ export function resetGlobalReportingObserver(): void {
69
+ if (globalObserver) globalObserver.disconnect();
70
+ globalObserver = null;
71
+ }