@thoughtspot/visual-embed-sdk 1.51.2 → 1.52.1

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 (316) hide show
  1. package/cjs/package.json +9 -1
  2. package/cjs/src/api-intercept.d.ts.map +1 -1
  3. package/cjs/src/api-intercept.js +1 -0
  4. package/cjs/src/api-intercept.js.map +1 -1
  5. package/cjs/src/contracts/contracts.spec.d.ts +2 -0
  6. package/cjs/src/contracts/contracts.spec.d.ts.map +1 -0
  7. package/cjs/src/contracts/contracts.spec.js +345 -0
  8. package/cjs/src/contracts/contracts.spec.js.map +1 -0
  9. package/cjs/src/contracts/embed-event-payloads.d.ts +73 -0
  10. package/cjs/src/contracts/embed-event-payloads.d.ts.map +1 -0
  11. package/cjs/src/contracts/embed-event-payloads.js +3 -0
  12. package/cjs/src/contracts/embed-event-payloads.js.map +1 -0
  13. package/cjs/src/contracts/host-event-contracts.d.ts +378 -0
  14. package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -0
  15. package/cjs/src/contracts/host-event-contracts.js +3 -0
  16. package/cjs/src/contracts/host-event-contracts.js.map +1 -0
  17. package/cjs/src/contracts/index.d.ts +22 -0
  18. package/cjs/src/contracts/index.d.ts.map +1 -0
  19. package/cjs/src/contracts/index.js +33 -0
  20. package/cjs/src/contracts/index.js.map +1 -0
  21. package/cjs/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  22. package/cjs/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  23. package/cjs/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
  24. package/cjs/src/contracts/ui-passthrough-contracts.js.map +1 -0
  25. package/cjs/src/css-variables.d.ts +1 -1
  26. package/cjs/src/embed/app.d.ts +17 -140
  27. package/cjs/src/embed/app.d.ts.map +1 -1
  28. package/cjs/src/embed/app.js +20 -120
  29. package/cjs/src/embed/app.js.map +1 -1
  30. package/cjs/src/embed/app.spec.js +70 -26
  31. package/cjs/src/embed/app.spec.js.map +1 -1
  32. package/cjs/src/embed/conversation.d.ts +5 -5
  33. package/cjs/src/embed/events.spec.js +12 -2
  34. package/cjs/src/embed/events.spec.js.map +1 -1
  35. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  36. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  37. package/cjs/src/embed/hostEventClient/host-event-client.js +23 -18
  38. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  39. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +36 -36
  40. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  41. package/cjs/src/embed/hostEventClient/utils.d.ts +1 -1
  42. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  43. package/cjs/src/embed/hostEventClient/utils.js +3 -3
  44. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  45. package/cjs/src/embed/liveboard.d.ts +9 -161
  46. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  47. package/cjs/src/embed/liveboard.js +68 -135
  48. package/cjs/src/embed/liveboard.js.map +1 -1
  49. package/cjs/src/embed/liveboard.spec.js +215 -32
  50. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  51. package/cjs/src/embed/search.d.ts +14 -0
  52. package/cjs/src/embed/search.d.ts.map +1 -1
  53. package/cjs/src/embed/search.js +4 -1
  54. package/cjs/src/embed/search.js.map +1 -1
  55. package/cjs/src/embed/search.spec.js +65 -0
  56. package/cjs/src/embed/search.spec.js.map +1 -1
  57. package/cjs/src/embed/ts-embed.d.ts +21 -25
  58. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  59. package/cjs/src/embed/ts-embed.js +105 -72
  60. package/cjs/src/embed/ts-embed.js.map +1 -1
  61. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  62. package/cjs/src/embed/ts-embed.spec.js +380 -33
  63. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  64. package/cjs/src/full-height.d.ts +137 -0
  65. package/cjs/src/full-height.d.ts.map +1 -0
  66. package/cjs/src/full-height.js +272 -0
  67. package/cjs/src/full-height.js.map +1 -0
  68. package/cjs/src/full-height.spec.d.ts +2 -0
  69. package/cjs/src/full-height.spec.d.ts.map +1 -0
  70. package/cjs/src/full-height.spec.js +835 -0
  71. package/cjs/src/full-height.spec.js.map +1 -0
  72. package/cjs/src/index.d.ts +4 -3
  73. package/cjs/src/index.d.ts.map +1 -1
  74. package/cjs/src/index.js +5 -4
  75. package/cjs/src/index.js.map +1 -1
  76. package/cjs/src/react/all-types-export.d.ts +1 -1
  77. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  78. package/cjs/src/react/all-types-export.js +2 -1
  79. package/cjs/src/react/all-types-export.js.map +1 -1
  80. package/cjs/src/react/all-types-export.parity.spec.js +55 -3
  81. package/cjs/src/react/all-types-export.parity.spec.js.map +1 -1
  82. package/cjs/src/react/index.d.ts +8 -8
  83. package/cjs/src/react/index.d.ts.map +1 -1
  84. package/cjs/src/react/index.js +1 -1
  85. package/cjs/src/react/index.js.map +1 -1
  86. package/cjs/src/react/index.spec.js +7 -7
  87. package/cjs/src/react/index.spec.js.map +1 -1
  88. package/cjs/src/types.d.ts +664 -39
  89. package/cjs/src/types.d.ts.map +1 -1
  90. package/cjs/src/types.js +406 -13
  91. package/cjs/src/types.js.map +1 -1
  92. package/cjs/src/utils/processTrigger.d.ts +3 -1
  93. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  94. package/cjs/src/utils/processTrigger.js +19 -51
  95. package/cjs/src/utils/processTrigger.js.map +1 -1
  96. package/cjs/src/utils/transport/iframe-transport.d.ts +55 -0
  97. package/cjs/src/utils/transport/iframe-transport.d.ts.map +1 -0
  98. package/cjs/src/utils/transport/iframe-transport.js +108 -0
  99. package/cjs/src/utils/transport/iframe-transport.js.map +1 -0
  100. package/cjs/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  101. package/cjs/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  102. package/cjs/src/utils/transport/iframe-transport.spec.js +140 -0
  103. package/cjs/src/utils/transport/iframe-transport.spec.js.map +1 -0
  104. package/cjs/src/utils.d.ts +18 -0
  105. package/cjs/src/utils.d.ts.map +1 -1
  106. package/cjs/src/utils.js +39 -1
  107. package/cjs/src/utils.js.map +1 -1
  108. package/cjs/src/utils.spec.js +62 -0
  109. package/cjs/src/utils.spec.js.map +1 -1
  110. package/dist/{index-D8_Zs-Nr.js → index-C1pmYb5H.js} +1 -1
  111. package/dist/src/api-intercept.d.ts.map +1 -1
  112. package/dist/src/contracts/contracts.spec.d.ts +2 -0
  113. package/dist/src/contracts/contracts.spec.d.ts.map +1 -0
  114. package/dist/src/contracts/embed-event-payloads.d.ts +73 -0
  115. package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -0
  116. package/dist/src/contracts/host-event-contracts.d.ts +378 -0
  117. package/dist/src/contracts/host-event-contracts.d.ts.map +1 -0
  118. package/dist/src/contracts/index.d.ts +22 -0
  119. package/dist/src/contracts/index.d.ts.map +1 -0
  120. package/dist/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  121. package/dist/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  122. package/dist/src/css-variables.d.ts +1 -1
  123. package/dist/src/embed/app.d.ts +17 -140
  124. package/dist/src/embed/app.d.ts.map +1 -1
  125. package/dist/src/embed/conversation.d.ts +5 -5
  126. package/dist/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  127. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  128. package/dist/src/embed/hostEventClient/utils.d.ts +1 -1
  129. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  130. package/dist/src/embed/liveboard.d.ts +9 -161
  131. package/dist/src/embed/liveboard.d.ts.map +1 -1
  132. package/dist/src/embed/search.d.ts +14 -0
  133. package/dist/src/embed/search.d.ts.map +1 -1
  134. package/dist/src/embed/ts-embed.d.ts +21 -25
  135. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  136. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  137. package/dist/src/full-height.d.ts +137 -0
  138. package/dist/src/full-height.d.ts.map +1 -0
  139. package/dist/src/full-height.spec.d.ts +2 -0
  140. package/dist/src/full-height.spec.d.ts.map +1 -0
  141. package/dist/src/index.d.ts +4 -3
  142. package/dist/src/index.d.ts.map +1 -1
  143. package/dist/src/react/all-types-export.d.ts +1 -1
  144. package/dist/src/react/all-types-export.d.ts.map +1 -1
  145. package/dist/src/react/index.d.ts +8 -8
  146. package/dist/src/react/index.d.ts.map +1 -1
  147. package/dist/src/types.d.ts +664 -39
  148. package/dist/src/types.d.ts.map +1 -1
  149. package/dist/src/utils/processTrigger.d.ts +3 -1
  150. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  151. package/dist/src/utils/transport/iframe-transport.d.ts +55 -0
  152. package/dist/src/utils/transport/iframe-transport.d.ts.map +1 -0
  153. package/dist/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  154. package/dist/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  155. package/dist/src/utils.d.ts +18 -0
  156. package/dist/src/utils.d.ts.map +1 -1
  157. package/dist/tsembed-react.es.js +1031 -392
  158. package/dist/tsembed-react.js +1030 -391
  159. package/dist/tsembed.es.js +1031 -392
  160. package/dist/tsembed.js +1029 -390
  161. package/dist/visual-embed-sdk-react-full.d.ts +1483 -693
  162. package/dist/visual-embed-sdk-react.d.ts +1364 -647
  163. package/dist/visual-embed-sdk.d.ts +1426 -659
  164. package/lib/package.json +9 -1
  165. package/lib/src/api-intercept.d.ts.map +1 -1
  166. package/lib/src/api-intercept.js +2 -1
  167. package/lib/src/api-intercept.js.map +1 -1
  168. package/lib/src/contracts/contracts.spec.d.ts +2 -0
  169. package/lib/src/contracts/contracts.spec.d.ts.map +1 -0
  170. package/lib/src/contracts/contracts.spec.js +342 -0
  171. package/lib/src/contracts/contracts.spec.js.map +1 -0
  172. package/lib/src/contracts/embed-event-payloads.d.ts +73 -0
  173. package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -0
  174. package/lib/src/contracts/embed-event-payloads.js +2 -0
  175. package/lib/src/contracts/embed-event-payloads.js.map +1 -0
  176. package/lib/src/contracts/host-event-contracts.d.ts +378 -0
  177. package/lib/src/contracts/host-event-contracts.d.ts.map +1 -0
  178. package/lib/src/contracts/host-event-contracts.js +2 -0
  179. package/lib/src/contracts/host-event-contracts.js.map +1 -0
  180. package/lib/src/contracts/index.d.ts +22 -0
  181. package/lib/src/contracts/index.d.ts.map +1 -0
  182. package/lib/src/contracts/index.js +22 -0
  183. package/lib/src/contracts/index.js.map +1 -0
  184. package/lib/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  185. package/lib/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  186. package/lib/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
  187. package/lib/src/contracts/ui-passthrough-contracts.js.map +1 -0
  188. package/lib/src/css-variables.d.ts +1 -1
  189. package/lib/src/embed/app.d.ts +17 -140
  190. package/lib/src/embed/app.d.ts.map +1 -1
  191. package/lib/src/embed/app.js +22 -122
  192. package/lib/src/embed/app.js.map +1 -1
  193. package/lib/src/embed/app.spec.js +70 -26
  194. package/lib/src/embed/app.spec.js.map +1 -1
  195. package/lib/src/embed/conversation.d.ts +5 -5
  196. package/lib/src/embed/events.spec.js +12 -2
  197. package/lib/src/embed/events.spec.js.map +1 -1
  198. package/lib/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  199. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  200. package/lib/src/embed/hostEventClient/host-event-client.js +6 -1
  201. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  202. package/lib/src/embed/hostEventClient/host-event-client.spec.js +1 -1
  203. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  204. package/lib/src/embed/hostEventClient/utils.d.ts +1 -1
  205. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  206. package/lib/src/embed/hostEventClient/utils.js +1 -1
  207. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  208. package/lib/src/embed/liveboard.d.ts +9 -161
  209. package/lib/src/embed/liveboard.d.ts.map +1 -1
  210. package/lib/src/embed/liveboard.js +70 -137
  211. package/lib/src/embed/liveboard.js.map +1 -1
  212. package/lib/src/embed/liveboard.spec.js +215 -32
  213. package/lib/src/embed/liveboard.spec.js.map +1 -1
  214. package/lib/src/embed/search.d.ts +14 -0
  215. package/lib/src/embed/search.d.ts.map +1 -1
  216. package/lib/src/embed/search.js +4 -1
  217. package/lib/src/embed/search.js.map +1 -1
  218. package/lib/src/embed/search.spec.js +65 -0
  219. package/lib/src/embed/search.spec.js.map +1 -1
  220. package/lib/src/embed/ts-embed.d.ts +21 -25
  221. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  222. package/lib/src/embed/ts-embed.js +106 -73
  223. package/lib/src/embed/ts-embed.js.map +1 -1
  224. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  225. package/lib/src/embed/ts-embed.spec.js +378 -31
  226. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  227. package/lib/src/full-height.d.ts +137 -0
  228. package/lib/src/full-height.d.ts.map +1 -0
  229. package/lib/src/full-height.js +268 -0
  230. package/lib/src/full-height.js.map +1 -0
  231. package/lib/src/full-height.spec.d.ts +2 -0
  232. package/lib/src/full-height.spec.d.ts.map +1 -0
  233. package/lib/src/full-height.spec.js +833 -0
  234. package/lib/src/full-height.spec.js.map +1 -0
  235. package/lib/src/index.d.ts +4 -3
  236. package/lib/src/index.d.ts.map +1 -1
  237. package/lib/src/index.js +3 -3
  238. package/lib/src/index.js.map +1 -1
  239. package/lib/src/react/all-types-export.d.ts +1 -1
  240. package/lib/src/react/all-types-export.d.ts.map +1 -1
  241. package/lib/src/react/all-types-export.js +1 -1
  242. package/lib/src/react/all-types-export.js.map +1 -1
  243. package/lib/src/react/all-types-export.parity.spec.js +55 -3
  244. package/lib/src/react/all-types-export.parity.spec.js.map +1 -1
  245. package/lib/src/react/index.d.ts +8 -8
  246. package/lib/src/react/index.d.ts.map +1 -1
  247. package/lib/src/react/index.js +1 -1
  248. package/lib/src/react/index.js.map +1 -1
  249. package/lib/src/react/index.spec.js +7 -7
  250. package/lib/src/react/index.spec.js.map +1 -1
  251. package/lib/src/types.d.ts +664 -39
  252. package/lib/src/types.d.ts.map +1 -1
  253. package/lib/src/types.js +405 -12
  254. package/lib/src/types.js.map +1 -1
  255. package/lib/src/utils/processTrigger.d.ts +3 -1
  256. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  257. package/lib/src/utils/processTrigger.js +19 -51
  258. package/lib/src/utils/processTrigger.js.map +1 -1
  259. package/lib/src/utils/transport/iframe-transport.d.ts +55 -0
  260. package/lib/src/utils/transport/iframe-transport.d.ts.map +1 -0
  261. package/lib/src/utils/transport/iframe-transport.js +101 -0
  262. package/lib/src/utils/transport/iframe-transport.js.map +1 -0
  263. package/lib/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  264. package/lib/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  265. package/lib/src/utils/transport/iframe-transport.spec.js +138 -0
  266. package/lib/src/utils/transport/iframe-transport.spec.js.map +1 -0
  267. package/lib/src/utils.d.ts +18 -0
  268. package/lib/src/utils.d.ts.map +1 -1
  269. package/lib/src/utils.js +37 -0
  270. package/lib/src/utils.js.map +1 -1
  271. package/lib/src/utils.spec.js +63 -1
  272. package/lib/src/utils.spec.js.map +1 -1
  273. package/lib/src/visual-embed-sdk.d.ts +1426 -659
  274. package/package.json +9 -1
  275. package/src/api-intercept.ts +2 -1
  276. package/src/contracts/contracts.spec.ts +392 -0
  277. package/src/contracts/embed-event-payloads.ts +83 -0
  278. package/src/contracts/host-event-contracts.ts +456 -0
  279. package/src/contracts/index.ts +53 -0
  280. package/src/contracts/ui-passthrough-contracts.ts +301 -0
  281. package/src/css-variables.ts +1 -1
  282. package/src/embed/app.spec.ts +86 -34
  283. package/src/embed/app.ts +37 -264
  284. package/src/embed/conversation.ts +5 -5
  285. package/src/embed/events.spec.ts +14 -2
  286. package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
  287. package/src/embed/hostEventClient/host-event-client.ts +18 -5
  288. package/src/embed/hostEventClient/utils.ts +2 -1
  289. package/src/embed/liveboard.spec.ts +261 -42
  290. package/src/embed/liveboard.ts +78 -297
  291. package/src/embed/search.spec.ts +80 -0
  292. package/src/embed/search.ts +20 -0
  293. package/src/embed/ts-embed.spec.ts +518 -31
  294. package/src/embed/ts-embed.ts +133 -82
  295. package/src/full-height.spec.ts +1008 -0
  296. package/src/full-height.ts +361 -0
  297. package/src/index.ts +95 -5
  298. package/src/react/all-types-export.parity.spec.ts +63 -3
  299. package/src/react/all-types-export.ts +46 -0
  300. package/src/react/index.spec.tsx +7 -7
  301. package/src/react/index.tsx +9 -9
  302. package/src/types.ts +665 -37
  303. package/src/utils/processTrigger.ts +28 -58
  304. package/src/utils/transport/iframe-transport.spec.ts +177 -0
  305. package/src/utils/transport/iframe-transport.ts +122 -0
  306. package/src/utils.spec.ts +71 -0
  307. package/src/utils.ts +38 -0
  308. package/cjs/src/embed/hostEventClient/contracts.d.ts +0 -231
  309. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  310. package/cjs/src/embed/hostEventClient/contracts.js.map +0 -1
  311. package/dist/src/embed/hostEventClient/contracts.d.ts +0 -231
  312. package/dist/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  313. package/lib/src/embed/hostEventClient/contracts.d.ts +0 -231
  314. package/lib/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  315. package/lib/src/embed/hostEventClient/contracts.js.map +0 -1
  316. package/src/embed/hostEventClient/contracts.ts +0 -262
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thoughtspot/visual-embed-sdk",
3
- "version": "1.51.2",
3
+ "version": "1.52.1",
4
4
  "description": "ThoughtSpot Embed SDK",
5
5
  "module": "lib/src/index.js",
6
6
  "main": "dist/tsembed.js",
@@ -22,6 +22,11 @@
22
22
  "require": "./cjs/src/react/all-types-export.js",
23
23
  "types": "./lib/src/react/all-types-export.d.ts"
24
24
  },
25
+ "./contracts": {
26
+ "import": "./lib/src/contracts/index.js",
27
+ "require": "./cjs/src/contracts/index.js",
28
+ "types": "./lib/src/contracts/index.d.ts"
29
+ },
25
30
  "./lib/src/react": {
26
31
  "import": "./lib/src/react/all-types-export.js",
27
32
  "require": "./cjs/src/react/all-types-export.js",
@@ -32,6 +37,9 @@
32
37
  "*": {
33
38
  "react": [
34
39
  "./lib/src/react/all-types-export.d.ts"
40
+ ],
41
+ "contracts": [
42
+ "./lib/src/contracts/index.d.ts"
35
43
  ]
36
44
  }
37
45
  },
@@ -1,7 +1,7 @@
1
1
  import { getThoughtSpotHost } from "./config";
2
2
  import { getEmbedConfig } from "./embed/embedConfig";
3
3
  import { ERROR_MESSAGE } from "./errors";
4
- import { InterceptedApiType, BaseViewConfig, ApiInterceptFlags, EmbedEvent, EmbedErrorCodes, ErrorDetailsTypes, EmbedErrorDetailsEvent } from "./types";
4
+ import { InterceptedApiType, BaseViewConfig, ApiInterceptFlags, EmbedEvent, EmbedErrorCodes, ErrorDetailsTypes, EmbedErrorDetailsEvent, EmbedErrorSeverity } from "./types";
5
5
  import { embedEventStatus } from "./utils";
6
6
  import { logger } from "./utils/logger";
7
7
 
@@ -134,6 +134,7 @@ export const handleInterceptEvent = async (params: {
134
134
  errorType: ErrorDetailsTypes.API,
135
135
  message: ERROR_MESSAGE.ERROR_PARSING_API_INTERCEPT_BODY,
136
136
  code: EmbedErrorCodes.PARSING_API_INTERCEPT_BODY_ERROR,
137
+ severity: EmbedErrorSeverity.SEV3,
137
138
  error: ERROR_MESSAGE.ERROR_PARSING_API_INTERCEPT_BODY,
138
139
  };
139
140
  executeEvent(EmbedEvent.Error, errorDetails);
@@ -0,0 +1,392 @@
1
+ /**
2
+ * Contract drift guardrails.
3
+ *
4
+ * These tests are the CI gate for the additive-only contract policy:
5
+ * - The explicit wire-value lists below record which events have TYPED
6
+ * contracts. Removing an event from the typed maps (or renaming its wire
7
+ * value) fails the equality check and must be treated as a breaking change,
8
+ * not a refactor.
9
+ * - Type-level assertions verify the request/response resolution helpers
10
+ * keep resolving typed events to their contracts and unknown events to
11
+ * `any` (backward compatibility).
12
+ *
13
+ * When a list check fails: if you ADDED an event, add its wire value to the
14
+ * expected list here. If an existing entry disappeared or changed value,
15
+ * stop — that breaks published SDK consumers and the host runtime validation
16
+ * derived from these contracts.
17
+ */
18
+ import { HostEvent, EmbedEvent, RuntimeFilterOp } from '../types';
19
+ import { UIPassthroughEvent } from './ui-passthrough-contracts';
20
+ import type {
21
+ HostEventRequest,
22
+ HostEventResponse,
23
+ NavigateRequest,
24
+ SetActiveTabRequest,
25
+ TriggerData,
26
+ OpenFilterRequest,
27
+ OpenFilterSpotterRequest,
28
+ OpenFilterSearchRequest,
29
+ } from './host-event-contracts';
30
+ import type { CustomActionPayload, RuntimeFilter } from '../types';
31
+ import type {
32
+ CustomActionEventPayload,
33
+ EmbedEventData,
34
+ EmbedEventPayload,
35
+ } from './embed-event-payloads';
36
+ import * as contractsBarrel from './index';
37
+
38
+ // Events with explicitly typed requests in HostEventRequestMap.
39
+ // Keep in sync with the interface — this list is what the snapshot locks.
40
+ const TYPED_HOST_EVENTS: HostEvent[] = [
41
+ // Filters and parameters
42
+ HostEvent.UpdateRuntimeFilters,
43
+ HostEvent.UpdateParameters,
44
+ HostEvent.UpdateFilters,
45
+ HostEvent.UpdateCrossFilter,
46
+ HostEvent.OpenFilter,
47
+ HostEvent.OpenParameter,
48
+ // Tabs and vizs
49
+ HostEvent.SetVisibleVizs,
50
+ HostEvent.SetVisibleTabs,
51
+ HostEvent.SetHiddenTabs,
52
+ HostEvent.SetActiveTab,
53
+ // Navigation
54
+ HostEvent.Navigate,
55
+ // Search and columns
56
+ HostEvent.Search,
57
+ HostEvent.ResetSearch,
58
+ HostEvent.AddColumns,
59
+ HostEvent.RemoveColumn,
60
+ // Viz-scoped actions
61
+ HostEvent.Edit,
62
+ HostEvent.Save,
63
+ HostEvent.Delete,
64
+ HostEvent.Share,
65
+ HostEvent.Present,
66
+ HostEvent.CopyLink,
67
+ HostEvent.ExportTML,
68
+ HostEvent.EditTML,
69
+ HostEvent.UpdateTML,
70
+ HostEvent.SchedulesList,
71
+ HostEvent.Schedule,
72
+ HostEvent.SpotIQAnalyze,
73
+ HostEvent.ShowUnderlyingData,
74
+ HostEvent.CreateMonitor,
75
+ HostEvent.ManageMonitor,
76
+ HostEvent.SyncToSheets,
77
+ HostEvent.SyncToOtherApps,
78
+ HostEvent.ManagePipelines,
79
+ HostEvent.DownloadAsPng,
80
+ HostEvent.DownloadAsCsv,
81
+ HostEvent.DownloadAsXlsx,
82
+ HostEvent.DownloadAsPdf,
83
+ HostEvent.Explore,
84
+ HostEvent.AskSage,
85
+ HostEvent.AskSpotter,
86
+ HostEvent.AnswerChartSwitcher,
87
+ // Liveboard
88
+ HostEvent.UpdatePersonalisedView,
89
+ HostEvent.SelectPersonalizedView,
90
+ HostEvent.ResetLiveboardPersonalisedView,
91
+ HostEvent.AIHighlights,
92
+ HostEvent.SendTestScheduleEmail,
93
+ HostEvent.RefreshLiveboardBrowserCache,
94
+ // Spotter
95
+ HostEvent.SpotterSearch,
96
+ HostEvent.ResetSpotterConversation,
97
+ HostEvent.ShareSpotterConversation,
98
+ HostEvent.CloseSpotterShareConversation,
99
+ HostEvent.ExitSpotterSharedConversation,
100
+ HostEvent.PinSpotterConversation,
101
+ HostEvent.UnpinSpotterConversation,
102
+ HostEvent.EditLastPrompt,
103
+ HostEvent.DeleteLastPrompt,
104
+ HostEvent.PreviewSpotterData,
105
+ HostEvent.SpotterVizSendUserMessage,
106
+ HostEvent.InitSpotterVizConversation,
107
+ HostEvent.OpenSpotterVizPanel,
108
+ HostEvent.CloseSpotterVizPanel,
109
+ ];
110
+
111
+ // Type-level assertions: compile failures here mean contract resolution
112
+ // regressed. `expectType` is erased at runtime.
113
+ const expectType = <T>(value: T): T => value;
114
+
115
+ describe('event contracts (drift guardrails)', () => {
116
+ // The lists below LOCK the set of typed events. Adding an event is an
117
+ // intentional, additive edit here; a removed/renamed wire value fails this
118
+ // test — which is the signal that it is a breaking change, not a refactor.
119
+ test('typed host event wire values are stable (additive-only)', () => {
120
+ expect(TYPED_HOST_EVENTS.map((event) => `${event}`).sort()).toEqual([
121
+ 'AIHighlights',
122
+ 'AskSage',
123
+ 'AskSpotter',
124
+ 'CloseSpotterShareConversation',
125
+ 'CloseSpotterVizPanel',
126
+ 'DeleteLastPrompt',
127
+ 'EditLastPrompt',
128
+ 'ExitSpotterSharedConversation',
129
+ 'InitSpotterVizConversation',
130
+ 'Navigate',
131
+ 'OpenSpotterVizPanel',
132
+ 'PinSpotterConversation',
133
+ 'PreviewSpotterData',
134
+ 'ResetLiveboardPersonalisedView',
135
+ 'ResetSpotterConversation',
136
+ 'SelectPersonalisedView',
137
+ 'SetActiveTab',
138
+ 'SetPinboardHiddenTabs',
139
+ 'SetPinboardVisibleTabs',
140
+ 'SetPinboardVisibleVizs',
141
+ 'ShareSpotterConversation',
142
+ 'SpotterSearch',
143
+ 'SpotterVizSendUserMessage',
144
+ 'UnpinSpotterConversation',
145
+ 'UpdateCrossFilter',
146
+ 'UpdateParameters',
147
+ 'UpdatePersonalisedView',
148
+ 'UpdateRuntimeFilters',
149
+ 'addColumns',
150
+ 'answerChartSwitcher',
151
+ 'createMonitor',
152
+ 'downloadAsCSV',
153
+ 'downloadAsPdf',
154
+ 'downloadAsPng',
155
+ 'downloadAsXLSX',
156
+ 'edit',
157
+ 'editTSL',
158
+ 'embedDocument',
159
+ 'explore',
160
+ 'exportTSL',
161
+ 'manage-pipeline',
162
+ 'manageMonitor',
163
+ 'onDeleteAnswer',
164
+ 'openFilter',
165
+ 'openParameter',
166
+ 'present',
167
+ 'refreshLiveboardBrowserCache',
168
+ 'removeColumn',
169
+ 'resetSearch',
170
+ 'save',
171
+ 'schedule-list',
172
+ 'search',
173
+ 'sendTestScheduleEmail',
174
+ 'share',
175
+ 'showUnderlyingData',
176
+ 'spotIQAnalyze',
177
+ 'subscription',
178
+ 'sync-to-other-apps',
179
+ 'sync-to-sheets',
180
+ 'updateFilters',
181
+ 'updateTSL',
182
+ ]);
183
+ });
184
+
185
+ test('UI passthrough wire values are stable (additive-only)', () => {
186
+ expect(Object.values(UIPassthroughEvent).sort()).toEqual([
187
+ 'addVizToPinboard',
188
+ 'drillDown',
189
+ 'getAnswerPageConfig',
190
+ 'getAnswerSession',
191
+ 'getAvailableUiPassthroughs',
192
+ 'getDiscoverabilityStatus',
193
+ 'getExportRequestForCurrentPinboard',
194
+ 'getFilters',
195
+ 'getGroups',
196
+ 'getIframeUrl',
197
+ 'getParameters',
198
+ 'getPinboardPageConfig',
199
+ 'getTML',
200
+ 'getTabs',
201
+ 'getUnsavedAnswerTML',
202
+ 'saveAnswer',
203
+ 'updateFilters',
204
+ ]);
205
+ });
206
+
207
+ test('every typed host event is a real HostEvent member', () => {
208
+ const allHostEventValues = new Set<string>(Object.values(HostEvent));
209
+ TYPED_HOST_EVENTS.forEach((event) => {
210
+ expect(allHostEventValues.has(event)).toBe(true);
211
+ });
212
+ });
213
+
214
+ test('contract resolution helpers compile against the typed map', () => {
215
+ // Typed event resolves to its contract type.
216
+ expectType<RuntimeFilter[]>(
217
+ (undefined as unknown) as HostEventRequest<HostEvent.UpdateRuntimeFilters>,
218
+ );
219
+ expectType<SetActiveTabRequest>(
220
+ (undefined as unknown) as HostEventRequest<HostEvent.SetActiveTab>,
221
+ );
222
+ expectType<string | number | NavigateRequest>(
223
+ (undefined as unknown) as HostEventRequest<HostEvent.Navigate>,
224
+ );
225
+ // Untyped event stays `any` (backward compatible).
226
+ const untyped: HostEventRequest<HostEvent.LiveboardInfo> = { anything: 'goes' };
227
+ expect(untyped).toBeDefined();
228
+ // Response helper resolves for UI-passthrough-backed events.
229
+ expectType<HostEventResponse<HostEvent.GetTabs>>(
230
+ (undefined as unknown) as HostEventResponse<HostEvent.GetTabs>,
231
+ );
232
+ });
233
+
234
+ test('embed event enum wire values referenced by typed payloads are stable', () => {
235
+ expect(
236
+ [
237
+ EmbedEvent.AuthInit,
238
+ EmbedEvent.EmbedListenerReady,
239
+ EmbedEvent.CustomAction,
240
+ ].map((e) => `${e}`).sort(),
241
+ ).toEqual([
242
+ 'EmbedListenerReady',
243
+ 'authInit',
244
+ 'customAction',
245
+ ]);
246
+ });
247
+
248
+ test('CustomAction resolves to its typed payload; answerService on the dedicated type', () => {
249
+ // Wire data resolves to CustomActionPayload.
250
+ expectType<CustomActionPayload>(
251
+ (undefined as unknown) as EmbedEventData<EmbedEvent.CustomAction>,
252
+ );
253
+ // payload.data.id is a typed string (type-level indexed access).
254
+ expectType<string>(
255
+ (undefined as unknown) as EmbedEventPayload<EmbedEvent.CustomAction>['data']['id'],
256
+ );
257
+ // The dedicated type carries the SDK-added answerService (optional).
258
+ type AnswerServiceField = CustomActionEventPayload['answerService'];
259
+ const svc: AnswerServiceField = undefined;
260
+ expect(svc).toBeUndefined();
261
+ // Untyped embed event stays `any` (backward compatible).
262
+ const untyped: EmbedEventData<EmbedEvent.Data> = { anything: 'goes' };
263
+ expect(untyped).toBeDefined();
264
+ });
265
+
266
+ test('HostEvent doc examples compile against TriggerData (docs and types must agree)', () => {
267
+ // Payloads copied verbatim from the HostEvent enum @example blocks.
268
+ // If one stops compiling, the docs or the contract is wrong; fix that.
269
+ const trigger = <H extends HostEvent>(_event: H, _data: TriggerData<H>) => true;
270
+ const ok = [
271
+ trigger(HostEvent.UpdateParameters, [{ name: 'Integer Range Param', value: 10, isVisibleToUser: false }]),
272
+ trigger(HostEvent.UpdateParameters, [{
273
+ name: 'Integer Range Param',
274
+ value: 10,
275
+ applicability: { level: 'TAB', targetId: 'e0836cad-4fdf-42d4-bd97-567a6b2a6058' },
276
+ }]),
277
+ trigger(HostEvent.UpdateRuntimeFilters, [
278
+ { columnName: 'state', operator: RuntimeFilterOp.EQ, values: ['michigan'] },
279
+ { columnName: 'product', operator: RuntimeFilterOp.IN, values: ['shoes', 'boots'] },
280
+ ]),
281
+ trigger(HostEvent.UpdateFilters, { filter: { column: 'item type', oper: 'IN', values: ['bags', 'shirts'] } }),
282
+ trigger(HostEvent.UpdateFilters, {
283
+ filter: { column: 'date', oper: 'EQ', values: ['JULY', '2023'], type: 'MONTH_YEAR' },
284
+ }),
285
+ trigger(HostEvent.OpenFilter, {
286
+ column: { columnId: '<column-GUID>', name: 'column name', type: 'ATTRIBUTE', dataType: 'INT64' },
287
+ }),
288
+ trigger(HostEvent.OpenFilter, { column: { columnId: '<column-GUID>' } }),
289
+ trigger(HostEvent.OpenParameter, { parameter: { parameterId: '<parameter-GUID>' } }),
290
+ trigger(HostEvent.OpenParameter, {
291
+ parameter: { parameterId: '<parameter-GUID>' },
292
+ applicability: { level: 'GROUP', targetId: '<group-GUID>' },
293
+ }),
294
+ trigger(HostEvent.UpdateFilters, {
295
+ filter: {
296
+ column: 'item type',
297
+ oper: 'IN',
298
+ values: ['bags', 'shirts'],
299
+ applicability: { level: 'TAB', targetId: 'e0836cad-4fdf-42d4-bd97-567a6b2a6058' },
300
+ },
301
+ }),
302
+ trigger(HostEvent.OpenFilter, {
303
+ column: { columnId: '<column-GUID>' },
304
+ applicability: { level: 'TAB', targetId: '<tab-GUID>' },
305
+ }),
306
+ trigger(HostEvent.Navigate, -1),
307
+ trigger(HostEvent.Navigate, 'home'),
308
+ trigger(HostEvent.Navigate, { path: 'home', replace: true }),
309
+ trigger(HostEvent.Search, {
310
+ searchQuery: '[sales] by [item type]',
311
+ dataSources: ['cd252e5c-b552-49a8-821d-3eadaa049cca'],
312
+ execute: true,
313
+ }),
314
+ trigger(HostEvent.SetActiveTab, { tabId: '730496d6-6903-4601-937e-2c691821af3c' }),
315
+ trigger(HostEvent.UpdateCrossFilter, {
316
+ vizId: 'b535c760-8bbe-4e6f-bb26-af56b4129a1e',
317
+ conditions: [
318
+ { columnName: 'Category', values: ['mfgr#12', 'mfgr#14'] },
319
+ { columnName: 'color', values: ['mint', 'hot'] },
320
+ ],
321
+ }),
322
+ trigger(HostEvent.SpotterSearch, { query: 'revenue per year', executeSearch: true }),
323
+ ];
324
+ expect(ok.every(Boolean)).toBe(true);
325
+ });
326
+
327
+ // Per-context request interfaces are documentation-only today: exported and
328
+ // linked from docs, but trigger() still accepts the cross-context superset.
329
+ test('per-context request interfaces are exported and shaped as documented', () => {
330
+ expectType<OpenFilterSpotterRequest>({ column: { columnId: 'c' } });
331
+ expectType<OpenFilterSearchRequest>(
332
+ { column: { columnId: 'c', dataType: 'INT64' } },
333
+ );
334
+ // The default request stays the cross-context superset.
335
+ expectType<OpenFilterRequest>({} as HostEventRequest<HostEvent.OpenFilter>);
336
+ });
337
+
338
+ test('the /contracts barrel re-exports the public runtime surface', () => {
339
+ // Importing the barrel executes its re-exports; assert the runtime
340
+ // values consumers rely on from the /contracts entry point.
341
+ expect(contractsBarrel.UIPassthroughEvent).toBeDefined();
342
+ expect(contractsBarrel.CustomActionsPosition).toBeDefined();
343
+ expect(contractsBarrel.CustomActionTarget).toBeDefined();
344
+ expect(contractsBarrel.ApplicabilityLevel).toBeDefined();
345
+ });
346
+
347
+ test('trigger data (TriggerData) autocompletes and flags unknown fields', () => {
348
+ // Contract shape is the contextual type (autocomplete). Unknown fields
349
+ // on object literals fail; omission and non-literal extras do not.
350
+ type UpdateFiltersPayload = TriggerData<HostEvent.UpdateFilters>;
351
+
352
+ // Known fields resolve (drives autocomplete + hover).
353
+ const valid: UpdateFiltersPayload = {
354
+ filters: [{ columnName: 'Region', values: ['East'] }],
355
+ };
356
+ // Omitting fields still compiles (all fields optional).
357
+ const empty: UpdateFiltersPayload = {};
358
+ // Extra fields via a variable still compile (no excess check).
359
+ const viaVariable = {
360
+ filters: [{ columnName: 'Region', values: ['East'] }],
361
+ someExtra: 1,
362
+ };
363
+ const loose: UpdateFiltersPayload = viaVariable;
364
+ // Unknown fields on an object literal are flagged — at the top level...
365
+ const topExtra: UpdateFiltersPayload = {
366
+ filters: [],
367
+ // @ts-expect-error — `topLevelExtra` is not on the contract
368
+ topLevelExtra: 1,
369
+ };
370
+ // ...and at any depth.
371
+ const nestedExtra: UpdateFiltersPayload = {
372
+ // @ts-expect-error — `legacyField` is not on the filter contract
373
+ filters: [{ columnName: 'Region', values: ['East'], legacyField: true }],
374
+ };
375
+ // A non-literal sharing no field is flagged (TS weak-type check).
376
+ const unrelated = { totallyDifferent: true };
377
+ // @ts-expect-error — no overlap with the UpdateFilters contract
378
+ const zeroOverlap: UpdateFiltersPayload = unrelated;
379
+ // A wrong TYPE on a known field is flagged.
380
+ const bad: UpdateFiltersPayload = {
381
+ // @ts-expect-error — values must be an array, not a number
382
+ filters: [{ values: 123 }],
383
+ };
384
+ // `{}` is accepted for void events (AIHighlights requires it).
385
+ const voidEmpty: TriggerData<HostEvent.ResetSearch> = {};
386
+ // Unmapped events keep a fully permissive payload.
387
+ const unmapped: TriggerData<HostEvent.Reload> = { anything: 'goes' };
388
+
389
+ const all = [valid, empty, loose, topExtra, nestedExtra, zeroOverlap, bad];
390
+ expect([...all, voidEmpty, unmapped].every(Boolean)).toBe(true);
391
+ });
392
+ });
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Copyright (c) 2026
3
+ *
4
+ * Typed payload contracts for {@link EmbedEvent}s (ThoughtSpot app -> SDK).
5
+ *
6
+ * The SDK delivers embed events to `embed.on()` callbacks wrapped in the
7
+ * {@link MessagePayload} envelope `{ type, data, status? }`. The map below
8
+ * types the `data` field per event. Events absent from the map resolve to
9
+ * `any` until their payload is audited against what the host actually sends
10
+ * (codify observed behavior, not documented behavior).
11
+ *
12
+ * Same additive-only evolution rules as host-event-contracts.ts.
13
+ * @module contracts
14
+ */
15
+ import type { CustomActionPayload, EmbedEvent, MessagePayload } from '../types';
16
+ // Type-only: AnswerService is an SDK-side enrichment (see
17
+ // EmbedEventEnvelopeExtension). Type-only import keeps the contracts subpath
18
+ // free of any runtime dependency on the answer-service implementation.
19
+ import type { AnswerService } from '../utils/graphql/answerService/answerService';
20
+
21
+ /**
22
+ * Typed `data` field per embed event. Seed with audited events only.
23
+ */
24
+ export interface EmbedEventDataExtension {
25
+ [EmbedEvent.AuthInit]: {
26
+ /**
27
+ * Whether authentication was successful.
28
+ */
29
+ isLoggedIn?: boolean;
30
+ [key: string]: any;
31
+ };
32
+ [EmbedEvent.EmbedListenerReady]: Record<string, any>;
33
+ /**
34
+ * Fired when a callback-type custom action is triggered. Use
35
+ * `payload.data.id` to identify which action fired.
36
+ */
37
+ [EmbedEvent.CustomAction]: CustomActionPayload;
38
+ }
39
+
40
+ /**
41
+ * Resolves the typed `data` payload for an embed event; `any` when the
42
+ * event has not been audited/typed yet.
43
+ */
44
+ export type EmbedEventData<EmbedEventT extends EmbedEvent> =
45
+ EmbedEventT extends keyof EmbedEventDataExtension
46
+ ? EmbedEventDataExtension[EmbedEventT]
47
+ : any;
48
+
49
+ /**
50
+ * Full envelope delivered to `embed.on()` callbacks for a given event:
51
+ * the wire fields (`type`, `status`) plus the typed `data`.
52
+ */
53
+ export type EmbedEventPayload<EmbedEventT extends EmbedEvent> =
54
+ Omit<MessagePayload, 'data'> & {
55
+ data: EmbedEventData<EmbedEventT>;
56
+ };
57
+
58
+ /**
59
+ * Payload delivered to `on(EmbedEvent.CustomAction)`. Beyond the wire fields,
60
+ * the SDK attaches an {@link AnswerService} built from the event's session and
61
+ * answer data (see utils/processData.ts `processCustomAction`) — annotate your
62
+ * callback with this type to access it:
63
+ *
64
+ * ```ts
65
+ * embed.on(EmbedEvent.CustomAction, (payload: CustomActionEventPayload) => {
66
+ * if (payload.data.id === 'my-action') {
67
+ * payload.answerService?.getUnderlyingDataForPoint([]);
68
+ * }
69
+ * });
70
+ * ```
71
+ *
72
+ * It is a dedicated type rather than folded into `on()`'s generic callback
73
+ * because the SDK's event registry types callbacks as the plain
74
+ * {@link MessagePayload}, which the enrichment cannot be intersected into
75
+ * without restructuring that registry.
76
+ */
77
+ export type CustomActionEventPayload =
78
+ EmbedEventPayload<EmbedEvent.CustomAction> & { answerService?: AnswerService };
79
+
80
+ /**
81
+ * String-name keyed view for the host side (addresses events by wire value).
82
+ */
83
+ export type EmbedEventName = `${EmbedEvent}`;