@thoughtspot/visual-embed-sdk 1.46.5-beta.1 → 1.47.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 (242) hide show
  1. package/cjs/package.json +4 -4
  2. package/cjs/src/css-variables.d.ts +36 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +41 -17
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +26 -47
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +36 -79
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/conversation.d.ts +24 -2
  11. package/cjs/src/embed/conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/conversation.js +18 -33
  13. package/cjs/src/embed/conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.spec.js +129 -97
  15. package/cjs/src/embed/conversation.spec.js.map +1 -1
  16. package/cjs/src/embed/hostEventClient/contracts.d.ts +31 -0
  17. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  18. package/cjs/src/embed/hostEventClient/contracts.js +2 -0
  19. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  20. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +18 -0
  21. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  22. package/cjs/src/embed/hostEventClient/host-event-client.js +69 -9
  23. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  24. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +185 -19
  25. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  26. package/cjs/src/embed/hostEventClient/utils.d.ts +22 -0
  27. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -0
  28. package/cjs/src/embed/hostEventClient/utils.js +57 -0
  29. package/cjs/src/embed/hostEventClient/utils.js.map +1 -0
  30. package/cjs/src/embed/hostEventClient/utils.spec.d.ts +2 -0
  31. package/cjs/src/embed/hostEventClient/utils.spec.d.ts.map +1 -0
  32. package/cjs/src/embed/hostEventClient/utils.spec.js +190 -0
  33. package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -0
  34. package/cjs/src/embed/liveboard.d.ts +18 -1
  35. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  36. package/cjs/src/embed/liveboard.js +9 -11
  37. package/cjs/src/embed/liveboard.js.map +1 -1
  38. package/cjs/src/embed/liveboard.spec.js +29 -71
  39. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  40. package/cjs/src/embed/spotter-utils.d.ts +20 -0
  41. package/cjs/src/embed/spotter-utils.d.ts.map +1 -0
  42. package/cjs/src/embed/spotter-utils.js +52 -0
  43. package/cjs/src/embed/spotter-utils.js.map +1 -0
  44. package/cjs/src/embed/spotter-utils.spec.d.ts +2 -0
  45. package/cjs/src/embed/spotter-utils.spec.d.ts.map +1 -0
  46. package/cjs/src/embed/spotter-utils.spec.js +54 -0
  47. package/cjs/src/embed/spotter-utils.spec.js.map +1 -0
  48. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  49. package/cjs/src/embed/ts-embed.js +25 -5
  50. package/cjs/src/embed/ts-embed.js.map +1 -1
  51. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  52. package/cjs/src/embed/ts-embed.spec.js +28 -67
  53. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  54. package/cjs/src/errors.d.ts +2 -1
  55. package/cjs/src/errors.d.ts.map +1 -1
  56. package/cjs/src/errors.js +2 -1
  57. package/cjs/src/errors.js.map +1 -1
  58. package/cjs/src/index.d.ts +1 -2
  59. package/cjs/src/index.d.ts.map +1 -1
  60. package/cjs/src/index.js +2 -4
  61. package/cjs/src/index.js.map +1 -1
  62. package/cjs/src/react/all-types-export.d.ts +2 -2
  63. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  64. package/cjs/src/react/all-types-export.js +1 -3
  65. package/cjs/src/react/all-types-export.js.map +1 -1
  66. package/cjs/src/react/index.d.ts +1 -36
  67. package/cjs/src/react/index.d.ts.map +1 -1
  68. package/cjs/src/react/index.js +1 -34
  69. package/cjs/src/react/index.js.map +1 -1
  70. package/cjs/src/types.d.ts +143 -76
  71. package/cjs/src/types.d.ts.map +1 -1
  72. package/cjs/src/types.js +118 -47
  73. package/cjs/src/types.js.map +1 -1
  74. package/cjs/src/utils.d.ts +0 -9
  75. package/cjs/src/utils.d.ts.map +1 -1
  76. package/cjs/src/utils.js +1 -10
  77. package/cjs/src/utils.js.map +1 -1
  78. package/dist/{index-DW2wEHqy.js → index-Bm2Hck8q.js} +1 -1
  79. package/dist/src/css-variables.d.ts +36 -0
  80. package/dist/src/css-variables.d.ts.map +1 -1
  81. package/dist/src/embed/app.d.ts +41 -17
  82. package/dist/src/embed/app.d.ts.map +1 -1
  83. package/dist/src/embed/conversation.d.ts +24 -2
  84. package/dist/src/embed/conversation.d.ts.map +1 -1
  85. package/dist/src/embed/hostEventClient/contracts.d.ts +31 -0
  86. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  87. package/dist/src/embed/hostEventClient/host-event-client.d.ts +18 -0
  88. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  89. package/dist/src/embed/hostEventClient/utils.d.ts +22 -0
  90. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -0
  91. package/dist/src/embed/hostEventClient/utils.spec.d.ts +2 -0
  92. package/dist/src/embed/hostEventClient/utils.spec.d.ts.map +1 -0
  93. package/dist/src/embed/liveboard.d.ts +18 -1
  94. package/dist/src/embed/liveboard.d.ts.map +1 -1
  95. package/dist/src/embed/spotter-utils.d.ts +20 -0
  96. package/dist/src/embed/spotter-utils.d.ts.map +1 -0
  97. package/dist/src/embed/spotter-utils.spec.d.ts +2 -0
  98. package/dist/src/embed/spotter-utils.spec.d.ts.map +1 -0
  99. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  100. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  101. package/dist/src/errors.d.ts +2 -1
  102. package/dist/src/errors.d.ts.map +1 -1
  103. package/dist/src/index.d.ts +1 -2
  104. package/dist/src/index.d.ts.map +1 -1
  105. package/dist/src/react/all-types-export.d.ts +2 -2
  106. package/dist/src/react/all-types-export.d.ts.map +1 -1
  107. package/dist/src/react/index.d.ts +1 -36
  108. package/dist/src/react/index.d.ts.map +1 -1
  109. package/dist/src/types.d.ts +143 -76
  110. package/dist/src/types.d.ts.map +1 -1
  111. package/dist/src/utils.d.ts +0 -9
  112. package/dist/src/utils.d.ts.map +1 -1
  113. package/dist/tsembed-react.es.js +378 -304
  114. package/dist/tsembed-react.js +366 -294
  115. package/dist/tsembed.es.js +393 -285
  116. package/dist/tsembed.js +30798 -30691
  117. package/dist/visual-embed-sdk-react-full.d.ts +310 -273
  118. package/dist/visual-embed-sdk-react.d.ts +310 -273
  119. package/dist/visual-embed-sdk.d.ts +308 -243
  120. package/lib/package.json +4 -4
  121. package/lib/src/css-variables.d.ts +36 -0
  122. package/lib/src/css-variables.d.ts.map +1 -1
  123. package/lib/src/embed/app.d.ts +41 -17
  124. package/lib/src/embed/app.d.ts.map +1 -1
  125. package/lib/src/embed/app.js +28 -49
  126. package/lib/src/embed/app.js.map +1 -1
  127. package/lib/src/embed/app.spec.js +36 -79
  128. package/lib/src/embed/app.spec.js.map +1 -1
  129. package/lib/src/embed/conversation.d.ts +24 -2
  130. package/lib/src/embed/conversation.d.ts.map +1 -1
  131. package/lib/src/embed/conversation.js +19 -34
  132. package/lib/src/embed/conversation.js.map +1 -1
  133. package/lib/src/embed/conversation.spec.js +131 -99
  134. package/lib/src/embed/conversation.spec.js.map +1 -1
  135. package/lib/src/embed/hostEventClient/contracts.d.ts +31 -0
  136. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  137. package/lib/src/embed/hostEventClient/contracts.js +2 -0
  138. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  139. package/lib/src/embed/hostEventClient/host-event-client.d.ts +18 -0
  140. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  141. package/lib/src/embed/hostEventClient/host-event-client.js +69 -9
  142. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  143. package/lib/src/embed/hostEventClient/host-event-client.spec.js +185 -19
  144. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  145. package/lib/src/embed/hostEventClient/utils.d.ts +22 -0
  146. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -0
  147. package/lib/src/embed/hostEventClient/utils.js +49 -0
  148. package/lib/src/embed/hostEventClient/utils.js.map +1 -0
  149. package/lib/src/embed/hostEventClient/utils.spec.d.ts +2 -0
  150. package/lib/src/embed/hostEventClient/utils.spec.d.ts.map +1 -0
  151. package/lib/src/embed/hostEventClient/utils.spec.js +188 -0
  152. package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -0
  153. package/lib/src/embed/liveboard.d.ts +18 -1
  154. package/lib/src/embed/liveboard.d.ts.map +1 -1
  155. package/lib/src/embed/liveboard.js +9 -11
  156. package/lib/src/embed/liveboard.js.map +1 -1
  157. package/lib/src/embed/liveboard.spec.js +29 -71
  158. package/lib/src/embed/liveboard.spec.js.map +1 -1
  159. package/lib/src/embed/spotter-utils.d.ts +20 -0
  160. package/lib/src/embed/spotter-utils.d.ts.map +1 -0
  161. package/lib/src/embed/spotter-utils.js +47 -0
  162. package/lib/src/embed/spotter-utils.js.map +1 -0
  163. package/lib/src/embed/spotter-utils.spec.d.ts +2 -0
  164. package/lib/src/embed/spotter-utils.spec.d.ts.map +1 -0
  165. package/lib/src/embed/spotter-utils.spec.js +52 -0
  166. package/lib/src/embed/spotter-utils.spec.js.map +1 -0
  167. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  168. package/lib/src/embed/ts-embed.js +25 -5
  169. package/lib/src/embed/ts-embed.js.map +1 -1
  170. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  171. package/lib/src/embed/ts-embed.spec.js +30 -69
  172. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  173. package/lib/src/errors.d.ts +2 -1
  174. package/lib/src/errors.d.ts.map +1 -1
  175. package/lib/src/errors.js +2 -1
  176. package/lib/src/errors.js.map +1 -1
  177. package/lib/src/index.d.ts +1 -2
  178. package/lib/src/index.d.ts.map +1 -1
  179. package/lib/src/index.js +1 -2
  180. package/lib/src/index.js.map +1 -1
  181. package/lib/src/react/all-types-export.d.ts +2 -2
  182. package/lib/src/react/all-types-export.d.ts.map +1 -1
  183. package/lib/src/react/all-types-export.js +1 -1
  184. package/lib/src/react/all-types-export.js.map +1 -1
  185. package/lib/src/react/index.d.ts +1 -36
  186. package/lib/src/react/index.d.ts.map +1 -1
  187. package/lib/src/react/index.js +0 -33
  188. package/lib/src/react/index.js.map +1 -1
  189. package/lib/src/types.d.ts +143 -76
  190. package/lib/src/types.d.ts.map +1 -1
  191. package/lib/src/types.js +118 -47
  192. package/lib/src/types.js.map +1 -1
  193. package/lib/src/utils.d.ts +0 -9
  194. package/lib/src/utils.d.ts.map +1 -1
  195. package/lib/src/utils.js +0 -8
  196. package/lib/src/utils.js.map +1 -1
  197. package/lib/src/visual-embed-sdk.d.ts +308 -243
  198. package/package.json +4 -4
  199. package/src/css-variables.ts +45 -0
  200. package/src/embed/app.spec.ts +51 -107
  201. package/src/embed/app.ts +60 -82
  202. package/src/embed/conversation.spec.ts +150 -119
  203. package/src/embed/conversation.ts +34 -58
  204. package/src/embed/hostEventClient/contracts.ts +31 -0
  205. package/src/embed/hostEventClient/host-event-client.spec.ts +260 -19
  206. package/src/embed/hostEventClient/host-event-client.ts +87 -11
  207. package/src/embed/hostEventClient/utils.spec.ts +225 -0
  208. package/src/embed/hostEventClient/utils.ts +74 -0
  209. package/src/embed/liveboard.spec.ts +38 -93
  210. package/src/embed/liveboard.ts +28 -10
  211. package/src/embed/spotter-utils.spec.ts +56 -0
  212. package/src/embed/spotter-utils.ts +65 -0
  213. package/src/embed/ts-embed.spec.ts +56 -108
  214. package/src/embed/ts-embed.ts +25 -4
  215. package/src/errors.ts +2 -1
  216. package/src/index.ts +2 -5
  217. package/src/react/all-types-export.ts +0 -3
  218. package/src/react/index.tsx +15 -59
  219. package/src/types.ts +206 -138
  220. package/src/utils.ts +0 -14
  221. package/cjs/src/embed/sage.d.ts +0 -164
  222. package/cjs/src/embed/sage.d.ts.map +0 -1
  223. package/cjs/src/embed/sage.js +0 -88
  224. package/cjs/src/embed/sage.js.map +0 -1
  225. package/cjs/src/embed/sage.spec.d.ts +0 -2
  226. package/cjs/src/embed/sage.spec.d.ts.map +0 -1
  227. package/cjs/src/embed/sage.spec.js +0 -151
  228. package/cjs/src/embed/sage.spec.js.map +0 -1
  229. package/dist/src/embed/sage.d.ts +0 -164
  230. package/dist/src/embed/sage.d.ts.map +0 -1
  231. package/dist/src/embed/sage.spec.d.ts +0 -2
  232. package/dist/src/embed/sage.spec.d.ts.map +0 -1
  233. package/lib/src/embed/sage.d.ts +0 -164
  234. package/lib/src/embed/sage.d.ts.map +0 -1
  235. package/lib/src/embed/sage.js +0 -84
  236. package/lib/src/embed/sage.js.map +0 -1
  237. package/lib/src/embed/sage.spec.d.ts +0 -2
  238. package/lib/src/embed/sage.spec.d.ts.map +0 -1
  239. package/lib/src/embed/sage.spec.js +0 -148
  240. package/lib/src/embed/sage.spec.js.map +0 -1
  241. package/src/embed/sage.spec.ts +0 -206
  242. package/src/embed/sage.ts +0 -231
@@ -11,8 +11,6 @@ import {
11
11
  AppEmbed,
12
12
  LiveboardEmbed,
13
13
  AppViewConfig,
14
- SageEmbed,
15
- SageViewConfig,
16
14
  SearchViewConfig,
17
15
  AnswerService,
18
16
  SpotterEmbed,
@@ -2192,28 +2190,6 @@ describe('Unit test case for ts embed', () => {
2192
2190
  `http://${thoughtSpotHost}/?embedApp=true${defaultParams}#/embed/viz/${liveboardId}`,
2193
2191
  );
2194
2192
  });
2195
-
2196
- const defaultConfig: SageViewConfig = {
2197
- disableWorksheetChange: false,
2198
- hideWorksheetSelector: false,
2199
- hideSageAnswerHeader: false,
2200
- hideAutocompleteSuggestions: false,
2201
- hideSampleQuestions: false,
2202
- isProductTour: false,
2203
- dataPanelV2: false,
2204
- };
2205
-
2206
- const sageEmbed = new SageEmbed(getRootEl(), {
2207
- ...defaultConfig,
2208
- } as SageViewConfig);
2209
-
2210
- sageEmbed.render();
2211
- await executeAfterWait(() => {
2212
- expectUrlMatch(
2213
- getIFrameSrc(),
2214
- `http://${thoughtSpotHost}/?embedApp=true&enableDataPanelV2=false&isSageEmbed=true&disableWorksheetChange=false&hideWorksheetSelector=false&hideEurekaSuggestions=false&isProductTour=false&hideSageAnswerHeader=false&hideAction=%5B%22reportError%22%5D#/embed/eureka`,
2215
- );
2216
- });
2217
2193
  });
2218
2194
 
2219
2195
  it('Should add contextMenuEnabledOnWhichClick flag to the iframe with left value', async () => {
@@ -2230,29 +2206,6 @@ describe('Unit test case for ts embed', () => {
2230
2206
  `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&contextMenuEnabledOnWhichClick=left#/embed/viz/${liveboardId}`,
2231
2207
  );
2232
2208
  });
2233
-
2234
- const defaultConfig: SageViewConfig = {
2235
- disableWorksheetChange: false,
2236
- hideWorksheetSelector: false,
2237
- hideSageAnswerHeader: false,
2238
- hideAutocompleteSuggestions: false,
2239
- hideSampleQuestions: false,
2240
- isProductTour: false,
2241
- dataPanelV2: false,
2242
- };
2243
-
2244
- const sageEmbed = new SageEmbed(getRootEl(), {
2245
- ...defaultConfig,
2246
- contextMenuTrigger: ContextMenuTriggerOptions.LEFT_CLICK,
2247
- } as SageViewConfig);
2248
-
2249
- sageEmbed.render();
2250
- await executeAfterWait(() => {
2251
- expectUrlMatch(
2252
- getIFrameSrc(),
2253
- `http://${thoughtSpotHost}/?embedApp=true&enableDataPanelV2=false&contextMenuEnabledOnWhichClick=left&isSageEmbed=true&disableWorksheetChange=false&hideWorksheetSelector=false&hideEurekaSuggestions=false&isProductTour=false&hideSageAnswerHeader=false&hideAction=%5B%22reportError%22%5D#/embed/eureka`,
2254
- );
2255
- });
2256
2209
  });
2257
2210
 
2258
2211
  it('Should add contextMenuEnabledOnWhichClick flag to the iframe with right value', async () => {
@@ -2269,28 +2222,6 @@ describe('Unit test case for ts embed', () => {
2269
2222
  `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&contextMenuEnabledOnWhichClick=right#/embed/viz/${liveboardId}`,
2270
2223
  );
2271
2224
  });
2272
- const defaultConfig: SageViewConfig = {
2273
- disableWorksheetChange: false,
2274
- hideWorksheetSelector: false,
2275
- hideSageAnswerHeader: false,
2276
- hideAutocompleteSuggestions: false,
2277
- hideSampleQuestions: false,
2278
- isProductTour: false,
2279
- dataPanelV2: false,
2280
- };
2281
-
2282
- const sageEmbed = new SageEmbed(getRootEl(), {
2283
- ...defaultConfig,
2284
- contextMenuTrigger: ContextMenuTriggerOptions.RIGHT_CLICK,
2285
- } as SageViewConfig);
2286
-
2287
- sageEmbed.render();
2288
- await executeAfterWait(() => {
2289
- expectUrlMatch(
2290
- getIFrameSrc(),
2291
- `http://${thoughtSpotHost}/?embedApp=true&enableDataPanelV2=false&contextMenuEnabledOnWhichClick=right&isSageEmbed=true&disableWorksheetChange=false&hideWorksheetSelector=false&hideEurekaSuggestions=false&isProductTour=false&hideSageAnswerHeader=false&hideAction=%5B%22reportError%22%5D#/embed/eureka`,
2292
- );
2293
- });
2294
2225
  });
2295
2226
 
2296
2227
  it('Should add contextMenuEnabledOnWhichClick flag to the iframe with both value', async () => {
@@ -2307,28 +2238,6 @@ describe('Unit test case for ts embed', () => {
2307
2238
  `http://${thoughtSpotHost}/?embedApp=true${defaultParams}&contextMenuEnabledOnWhichClick=both#/embed/viz/${liveboardId}`,
2308
2239
  );
2309
2240
  });
2310
- const defaultConfig: SageViewConfig = {
2311
- disableWorksheetChange: false,
2312
- hideWorksheetSelector: false,
2313
- hideSageAnswerHeader: false,
2314
- hideAutocompleteSuggestions: false,
2315
- hideSampleQuestions: false,
2316
- isProductTour: false,
2317
- dataPanelV2: false,
2318
- };
2319
-
2320
- const sageEmbed = new SageEmbed(getRootEl(), {
2321
- ...defaultConfig,
2322
- contextMenuTrigger: ContextMenuTriggerOptions.BOTH_CLICKS,
2323
- } as SageViewConfig);
2324
-
2325
- sageEmbed.render();
2326
- await executeAfterWait(() => {
2327
- expectUrlMatch(
2328
- getIFrameSrc(),
2329
- `http://${thoughtSpotHost}/?embedApp=true&enableDataPanelV2=false&contextMenuEnabledOnWhichClick=both&isSageEmbed=true&disableWorksheetChange=false&hideWorksheetSelector=false&hideEurekaSuggestions=false&isProductTour=false&hideSageAnswerHeader=false&hideAction=%5B%22reportError%22%5D#/embed/eureka`,
2330
- );
2331
- });
2332
2241
  });
2333
2242
  });
2334
2243
 
@@ -3558,6 +3467,45 @@ describe('Unit test case for ts embed', () => {
3558
3467
  expect(getRootEl().nextElementSibling.innerHTML).toBe('');
3559
3468
  });
3560
3469
 
3470
+ it('should not call trigger or remove DOM if destroy is called before render', () => {
3471
+ const appEmbed = new AppEmbed(getRootEl(), {
3472
+ frameParams: { width: '100%', height: '100%' },
3473
+ });
3474
+
3475
+ const triggerSpy = jest.spyOn(appEmbed, 'trigger');
3476
+ const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild');
3477
+
3478
+ appEmbed.destroy();
3479
+
3480
+ expect(triggerSpy).not.toHaveBeenCalled();
3481
+ expect(removeChildSpy).not.toHaveBeenCalled();
3482
+ });
3483
+
3484
+ it('should still remove DOM element when trigger rejects (waitForCleanupOnDestroy: true)', async () => {
3485
+ const originalEmbedConfig = embedConfig.getEmbedConfig();
3486
+ embedConfig.setEmbedConfig({
3487
+ ...originalEmbedConfig,
3488
+ waitForCleanupOnDestroy: true,
3489
+ cleanupTimeout: 1000,
3490
+ });
3491
+
3492
+ const appEmbed = new AppEmbed(getRootEl(), {
3493
+ frameParams: { width: '100%', height: '100%' },
3494
+ });
3495
+ await appEmbed.render();
3496
+
3497
+ jest.spyOn(appEmbed, 'trigger').mockRejectedValue(new Error('trigger failed'));
3498
+ const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild').mockImplementation(() => getRootEl());
3499
+
3500
+ appEmbed.destroy();
3501
+
3502
+ await new Promise(resolve => setTimeout(resolve, 50));
3503
+
3504
+ expect(removeChildSpy).toHaveBeenCalled();
3505
+
3506
+ embedConfig.setEmbedConfig(originalEmbedConfig);
3507
+ });
3508
+
3561
3509
  describe('with waitForCleanupOnDestroy configuration', () => {
3562
3510
  let originalEmbedConfig: any;
3563
3511
 
@@ -4220,9 +4168,9 @@ describe('PreRender replaceExistingPreRender scenarios', () => {
4220
4168
  preRenderId: 'no-replace-test',
4221
4169
  liveboardId: 'lb2',
4222
4170
  });
4223
-
4171
+
4224
4172
  const result = await embed2.preRender(false, false);
4225
-
4173
+
4226
4174
  expect(result).toBe(embed2);
4227
4175
  // The original iframe should still have lb1
4228
4176
  const iframe = getIFrameEl();
@@ -4247,17 +4195,17 @@ describe('Destroy error handling', () => {
4247
4195
  frameParams: { width: '100%', height: '100%' },
4248
4196
  });
4249
4197
  await appEmbed.render();
4250
-
4198
+
4251
4199
  const logSpy = jest.spyOn(logger, 'log').mockImplementation(() => {});
4252
-
4200
+
4253
4201
  jest.spyOn(Node.prototype, 'removeChild').mockImplementationOnce(() => {
4254
4202
  throw new Error('Remove failed');
4255
4203
  });
4256
-
4204
+
4257
4205
  expect(() => {
4258
4206
  appEmbed.destroy();
4259
4207
  }).not.toThrow();
4260
-
4208
+
4261
4209
  expect(logSpy).toHaveBeenCalledWith('Error destroying TS Embed', expect.any(Error));
4262
4210
  logSpy.mockReset();
4263
4211
  });
@@ -4282,25 +4230,25 @@ describe('Fullscreen change handler behavior', () => {
4282
4230
  liveboardId: 'test-lb',
4283
4231
  });
4284
4232
  await liveboardEmbed.render();
4285
-
4233
+
4286
4234
  await executeAfterWait(() => {
4287
4235
  const iframe = getIFrameEl();
4288
4236
  expect(iframe).toBeTruthy();
4289
4237
  });
4290
4238
 
4291
4239
  mockProcessTrigger.mockResolvedValue({});
4292
-
4240
+
4293
4241
  liveboardEmbed['setupFullscreenChangeHandler']();
4294
-
4242
+
4295
4243
  Object.defineProperty(document, 'fullscreenElement', {
4296
4244
  value: null,
4297
4245
  writable: true,
4298
4246
  configurable: true,
4299
4247
  });
4300
-
4248
+
4301
4249
  const event = new Event('fullscreenchange');
4302
4250
  document.dispatchEvent(event);
4303
-
4251
+
4304
4252
  await executeAfterWait(() => {
4305
4253
  expect(mockProcessTrigger).toHaveBeenLastCalledWith(
4306
4254
  expect.any(Object),
@@ -4318,7 +4266,7 @@ describe('Fullscreen change handler behavior', () => {
4318
4266
  liveboardId: 'test-lb-fullscreen',
4319
4267
  });
4320
4268
  await liveboardEmbed.render();
4321
-
4269
+
4322
4270
  await executeAfterWait(() => {
4323
4271
  const iframe = getIFrameEl();
4324
4272
  expect(iframe).toBeTruthy();
@@ -4326,18 +4274,18 @@ describe('Fullscreen change handler behavior', () => {
4326
4274
 
4327
4275
  mockProcessTrigger.mockClear();
4328
4276
  mockProcessTrigger.mockResolvedValue({});
4329
-
4277
+
4330
4278
  liveboardEmbed['setupFullscreenChangeHandler']();
4331
-
4279
+
4332
4280
  Object.defineProperty(document, 'fullscreenElement', {
4333
4281
  value: getIFrameEl(),
4334
4282
  writable: true,
4335
4283
  configurable: true,
4336
4284
  });
4337
-
4285
+
4338
4286
  const event = new Event('fullscreenchange');
4339
4287
  document.dispatchEvent(event);
4340
-
4288
+
4341
4289
  await executeAfterWait(() => {
4342
4290
  expect(mockProcessTrigger).not.toHaveBeenCalledWith(
4343
4291
  expect.any(Object),
@@ -4365,7 +4313,7 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
4365
4313
  preRenderId,
4366
4314
  ...initialConfig,
4367
4315
  });
4368
-
4316
+
4369
4317
  await embed1.preRender();
4370
4318
  await waitFor(() => !!getIFrameEl());
4371
4319
 
@@ -1446,7 +1446,21 @@ export class TsEmbed {
1446
1446
  }
1447
1447
 
1448
1448
  // send an empty object, this is needed for liveboard default handlers
1449
- return this.hostEventClient.triggerHostEvent(messageType, data, context);
1449
+ return this.hostEventClient.triggerHostEvent(messageType, data, context).catch((err: Error & {
1450
+ isValidationError?: boolean;
1451
+ embedErrorDetails?: { errorType: ErrorDetailsTypes; message: string; code: EmbedErrorCodes; error: string };
1452
+ }): Promise<null> => {
1453
+ if (err?.isValidationError) {
1454
+ const errorDetails = err.embedErrorDetails ?? {
1455
+ errorType: ErrorDetailsTypes.VALIDATION_ERROR,
1456
+ message: err.message || ERROR_MESSAGE.UPDATEFILTERS_INVALID_PAYLOAD,
1457
+ code: EmbedErrorCodes.UPDATEFILTERS_INVALID_PAYLOAD,
1458
+ error: err.message,
1459
+ };
1460
+ this.handleError(errorDetails);
1461
+ }
1462
+ throw err;
1463
+ });
1450
1464
  }
1451
1465
 
1452
1466
  /**
@@ -1588,6 +1602,9 @@ export class TsEmbed {
1588
1602
  try {
1589
1603
  this.removeFullscreenChangeHandler();
1590
1604
  this.unsubscribeToEvents();
1605
+ if (!this.isRendered) {
1606
+ return;
1607
+ }
1591
1608
  if (!getEmbedConfig().waitForCleanupOnDestroy) {
1592
1609
  this.trigger(HostEvent.DestroyEmbed)
1593
1610
  this.insertedDomEl?.parentNode?.removeChild(this.insertedDomEl);
@@ -1596,10 +1613,14 @@ export class TsEmbed {
1596
1613
  Promise.race([
1597
1614
  this.trigger(HostEvent.DestroyEmbed),
1598
1615
  new Promise((resolve) => setTimeout(resolve, cleanupTimeout)),
1599
- ]).then(() => {
1600
- this.insertedDomEl?.parentNode?.removeChild(this.insertedDomEl);
1601
- }).catch((e) => {
1616
+ ]).catch((e) => {
1602
1617
  logger.log('Error destroying TS Embed', e);
1618
+ }).finally(() => {
1619
+ try {
1620
+ this.insertedDomEl?.parentNode?.removeChild(this.insertedDomEl);
1621
+ } catch (e) {
1622
+ logger.log('Error removing DOM element on destroy', e);
1623
+ }
1603
1624
  });
1604
1625
  }
1605
1626
  } catch (e) {
package/src/errors.ts CHANGED
@@ -4,7 +4,6 @@ export const ERROR_MESSAGE = {
4
4
  LIVEBOARD_VIZ_ID_VALIDATION: 'Please select a Liveboard to embed.',
5
5
  TRIGGER_TIMED_OUT: 'Trigger timed-out in getting a response',
6
6
  SEARCHEMBED_BETA_WRANING_MESSAGE: 'SearchEmbed is in Beta in this release.',
7
- SAGE_EMBED_BETA_WARNING_MESSAGE: 'SageEmbed is in Beta in this release.',
8
7
  THIRD_PARTY_COOKIE_BLOCKED_ALERT: '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.',
9
8
  DUPLICATE_TOKEN_ERR: 'Duplicate token. Please issue a new token every time getAuthToken callback is called. See https://developers.thoughtspot.com/docs/?pageid=embed-auth#trusted-auth-embed for more details.',
10
9
  SDK_NOT_INITIALIZED: 'SDK not initialized',
@@ -30,6 +29,8 @@ export const ERROR_MESSAGE = {
30
29
  SSR_ENVIRONMENT_ERROR: 'SSR environment detected. This function cannot be called in SSR environment.',
31
30
  UPDATE_PARAMS_FAILED: 'Failed to update embed parameters',
32
31
  INVALID_SPOTTER_DOCUMENTATION_URL: 'Invalid spotterDocumentationUrl. Please provide a valid http or https URL.',
32
+ UPDATEFILTERS_INVALID_PAYLOAD: 'UpdateFilters requires a valid filter or filters array. Expected: { filter: { column, oper, values } } or { filters: [{ column, oper, values }, ...] }',
33
+ DRILLDOWN_INVALID_PAYLOAD: 'DrillDown requires a valid points object. Expected: { points: { clickedPoint?, selectedPoints? }, autoDrillDown?, vizId? }',
33
34
  };
34
35
 
35
36
  export const CUSTOM_ACTIONS_ERROR_MESSAGE = {
package/src/index.ts CHANGED
@@ -67,13 +67,12 @@ import {
67
67
  CustomActionTarget,
68
68
  InterceptedApiType,
69
69
  EmbedErrorCodes,
70
- EmbedErrorDetailsEvent,
70
+ EmbedErrorDetailsEvent,
71
71
  ErrorDetailsTypes,
72
72
  ContextType,
73
73
  AutoMCPFrameRendererViewConfig,
74
74
  } from './types';
75
75
  import { CustomCssVariables } from './css-variables';
76
- import { SageEmbed, SageViewConfig } from './embed/sage';
77
76
  import { AnswerService, SessionInterface, UnderlyingDataPoint } from './utils/graphql/answerService/answerService';
78
77
  import { getEmbedConfig } from './embed/embedConfig';
79
78
  import { uploadMixpanelEvent, MIXPANEL_EVENT } from './mixpanel-service';
@@ -100,7 +99,6 @@ export {
100
99
  SearchBarEmbed,
101
100
  PinboardEmbed,
102
101
  LiveboardEmbed,
103
- SageEmbed,
104
102
  AppEmbed,
105
103
  SpotterAgentEmbed,
106
104
  SpotterAgentEmbedViewConfig,
@@ -134,7 +132,6 @@ export {
134
132
  SearchViewConfig,
135
133
  SearchBarViewConfig,
136
134
  LiveboardViewConfig,
137
- SageViewConfig,
138
135
  AppViewConfig,
139
136
  PrefetchFeatures,
140
137
  FrameParams,
@@ -171,4 +168,4 @@ export {
171
168
  };
172
169
 
173
170
  export { resetCachedAuthToken } from './authToken';
174
- export { startAutoMCPFrameRenderer } from './embed/auto-frame-renderer';
171
+ export { startAutoMCPFrameRenderer } from './embed/auto-frame-renderer';
@@ -7,8 +7,6 @@ export {
7
7
  PreRenderedSearchBarEmbed,
8
8
  AppEmbed,
9
9
  PreRenderedAppEmbed,
10
- SageEmbed,
11
- PreRenderedSageEmbed,
12
10
  SpotterEmbed,
13
11
  ConversationEmbed,
14
12
  PreRenderedConversationEmbed,
@@ -44,7 +42,6 @@ export {
44
42
  SearchViewConfig,
45
43
  SearchBarViewConfig,
46
44
  LiveboardViewConfig,
47
- SageViewConfig,
48
45
  AppViewConfig,
49
46
  PrefetchFeatures,
50
47
  FrameParams,
@@ -5,7 +5,6 @@ import useDeepCompareEffect from 'use-deep-compare-effect';
5
5
  import { AuthEventEmitter } from '../auth';
6
6
  import { deepMerge } from '../utils';
7
7
  import { SearchBarEmbed as _SearchBarEmbed, SearchBarViewConfig } from '../embed/search-bar';
8
- import { SageEmbed as _SageEmbed, SageViewConfig } from '../embed/sage';
9
8
  import { SearchEmbed as _SearchEmbed, SearchViewConfig } from '../embed/search';
10
9
  import { AppEmbed as _AppEmbed, AppViewConfig } from '../embed/app';
11
10
  import { LiveboardEmbed as _LiveboardEmbed, LiveboardViewConfig } from '../embed/liveboard';
@@ -299,48 +298,6 @@ export const PreRenderedSearchBarEmbed = componentFactory<
299
298
  SearchBarViewConfig
300
299
  >(_SearchBarEmbed, true);
301
300
 
302
- interface SageEmbedProps extends EmbedProps, SageViewConfig { }
303
-
304
- /**
305
- * React component for LLM based search Sage embed.
306
- * @example
307
- * ```tsx
308
- * function Sage() {
309
- * return <SageEmbed
310
- * showObjectResults={true}
311
- * ... other view config props or event listeners.
312
- * />
313
- * }
314
- * ```
315
- */
316
- export const SageEmbed = componentFactory<typeof _SageEmbed, SageEmbedProps, SageViewConfig>(
317
- _SageEmbed,
318
- );
319
-
320
- /**
321
- * React component for PreRendered Sage embed.
322
- *
323
- * PreRenderedSageEmbed will preRender the SageEmbed and will be hidden by
324
- * default.
325
- *
326
- * SageEmbed with preRenderId passed will call showPreRender on the embed.
327
- * @example
328
- * ```tsx
329
- * function LandingPageComponent() {
330
- * return <PreRenderedSageEmbed preRenderId="someId" showObjectResults={true} />
331
- * }
332
- * ```
333
- * function MyComponent() {
334
- * return <SageEmbed preRenderId="someId" showObjectResults={true} />
335
- * }
336
- * ```
337
- */
338
- export const PreRenderedSageEmbed = componentFactory<
339
- typeof _SageEmbed,
340
- SageEmbedProps & PreRenderProps,
341
- SageViewConfig
342
- >(_SageEmbed, true);
343
-
344
301
  interface SpotterEmbedProps extends EmbedProps, SpotterEmbedViewConfig { }
345
302
  interface ConversationEmbedProps extends EmbedProps, ConversationViewConfig { }
346
303
 
@@ -409,24 +366,24 @@ type SpotterMessageProps = {
409
366
 
410
367
  /**
411
368
  * React component for displaying individual conversation messages from SpotterAgent.
412
- *
369
+ *
413
370
  * This component renders a single message response from your ThoughtSpot conversation,
414
371
  * showing charts, visualizations, or text responses based on the user's query.
415
- *
372
+ *
416
373
  * @version SDK: 1.39.0 | ThoughtSpot: 10.11.0.cl
417
374
  * @example
418
375
  * ```tsx
419
376
  * const { sendMessage } = useSpotterAgent({ worksheetId: 'worksheetId' });
420
377
  * const result = await sendMessage('show me sales by region');
421
- *
378
+ *
422
379
  * if (!result.error) {
423
380
  * // Simple usage - just pass the message data
424
381
  * <SpotterMessage message={result.message} />
425
- *
382
+ *
426
383
  * // With optional query for context
427
- * <SpotterMessage
428
- * message={result.message}
429
- * query={result.query}
384
+ * <SpotterMessage
385
+ * message={result.message}
386
+ * query={result.query}
430
387
  * />
431
388
  * }
432
389
  * ```
@@ -436,7 +393,7 @@ export const SpotterMessage = React.forwardRef<
436
393
  SpotterMessageProps
437
394
  >((props, ref) => {
438
395
  const { message, query: _, ...otherProps } = props;
439
-
396
+
440
397
  return (
441
398
  <ConversationMessage
442
399
  ref={ref}
@@ -475,7 +432,6 @@ type EmbedComponent = typeof SearchEmbed
475
432
  | typeof AppEmbed
476
433
  | typeof LiveboardEmbed
477
434
  | typeof SearchBarEmbed
478
- | typeof SageEmbed
479
435
  | typeof ConversationMessage
480
436
  | typeof SpotterMessage
481
437
  | typeof SpotterEmbed
@@ -527,20 +483,20 @@ export function useInit(config: EmbedConfig) {
527
483
 
528
484
  /**
529
485
  * React hook for interacting with SpotterAgent AI conversations.
530
- *
486
+ *
531
487
  * This hook provides a sendMessage function that allows you to send natural language
532
488
  * queries to your data and get back AI-generated responses with visualizations.
533
- *
489
+ *
534
490
  * @version SDK: 1.39.0 | ThoughtSpot: 10.11.0.cl
535
491
  * @param config - Configuration object containing worksheetId and other options
536
492
  * @returns Object with sendMessage function that returns conversation results
537
493
  * @example
538
494
  * ```tsx
539
495
  * const { sendMessage } = useSpotterAgent({ worksheetId: 'worksheetId' });
540
- *
496
+ *
541
497
  * const handleQuery = async () => {
542
498
  * const result = await sendMessage('show me sales by region');
543
- *
499
+ *
544
500
  * if (!result.error) {
545
501
  * // Display the message response
546
502
  * <SpotterMessage message={result.message} />
@@ -552,14 +508,14 @@ export function useInit(config: EmbedConfig) {
552
508
  */
553
509
  export function useSpotterAgent(config: SpotterAgentEmbedViewConfig) {
554
510
  const serviceRef = useRef<_SpotterAgentEmbed | null>(null);
555
-
511
+
556
512
  useDeepCompareEffect(() => {
557
513
  if (serviceRef.current) {
558
514
  serviceRef.current = null;
559
515
  }
560
-
516
+
561
517
  serviceRef.current = new _SpotterAgentEmbed(config);
562
-
518
+
563
519
  return () => {
564
520
  serviceRef.current = null;
565
521
  };