@thoughtspot/visual-embed-sdk 1.52.0 → 1.52.2-beta

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 (385) hide show
  1. package/cjs/package.json +19 -4
  2. package/cjs/src/contracts/contracts.spec.d.ts +2 -0
  3. package/cjs/src/contracts/contracts.spec.d.ts.map +1 -0
  4. package/cjs/src/contracts/contracts.spec.js +345 -0
  5. package/cjs/src/contracts/contracts.spec.js.map +1 -0
  6. package/cjs/src/contracts/embed-event-payloads.d.ts +73 -0
  7. package/cjs/src/contracts/embed-event-payloads.d.ts.map +1 -0
  8. package/cjs/src/contracts/embed-event-payloads.js +3 -0
  9. package/cjs/src/contracts/embed-event-payloads.js.map +1 -0
  10. package/cjs/src/contracts/host-event-contracts.d.ts +416 -0
  11. package/cjs/src/contracts/host-event-contracts.d.ts.map +1 -0
  12. package/cjs/src/contracts/host-event-contracts.js +3 -0
  13. package/cjs/src/contracts/host-event-contracts.js.map +1 -0
  14. package/cjs/src/contracts/index.d.ts +22 -0
  15. package/cjs/src/contracts/index.d.ts.map +1 -0
  16. package/cjs/src/contracts/index.js +33 -0
  17. package/cjs/src/contracts/index.js.map +1 -0
  18. package/cjs/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  19. package/cjs/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  20. package/cjs/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
  21. package/cjs/src/contracts/ui-passthrough-contracts.js.map +1 -0
  22. package/cjs/src/embed/app.d.ts +21 -143
  23. package/cjs/src/embed/app.d.ts.map +1 -1
  24. package/cjs/src/embed/app.js +21 -121
  25. package/cjs/src/embed/app.js.map +1 -1
  26. package/cjs/src/embed/app.spec.js +80 -26
  27. package/cjs/src/embed/app.spec.js.map +1 -1
  28. package/cjs/src/embed/auto-frame-renderer.js +1 -1
  29. package/cjs/src/embed/auto-frame-renderer.js.map +1 -1
  30. package/cjs/src/embed/auto-frame-renderer.spec.js +24 -13
  31. package/cjs/src/embed/auto-frame-renderer.spec.js.map +1 -1
  32. package/cjs/src/embed/bodyless-conversation.js +1 -1
  33. package/cjs/src/embed/bodyless-conversation.js.map +1 -1
  34. package/cjs/src/embed/conversation.d.ts +1 -0
  35. package/cjs/src/embed/conversation.d.ts.map +1 -1
  36. package/cjs/src/embed/conversation.js +4 -4
  37. package/cjs/src/embed/conversation.js.map +1 -1
  38. package/cjs/src/embed/conversation.spec.js +35 -24
  39. package/cjs/src/embed/conversation.spec.js.map +1 -1
  40. package/cjs/src/embed/embedConfig.spec.js +2 -1
  41. package/cjs/src/embed/embedConfig.spec.js.map +1 -1
  42. package/cjs/src/embed/events.spec.js +12 -2
  43. package/cjs/src/embed/events.spec.js.map +1 -1
  44. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +5 -4
  45. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  46. package/cjs/src/embed/hostEventClient/host-event-client.js +34 -23
  47. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  48. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +50 -44
  49. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  50. package/cjs/src/embed/hostEventClient/utils.d.ts +10 -1
  51. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  52. package/cjs/src/embed/hostEventClient/utils.js +52 -6
  53. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  54. package/cjs/src/embed/hostEventClient/utils.spec.js +151 -0
  55. package/cjs/src/embed/hostEventClient/utils.spec.js.map +1 -1
  56. package/cjs/src/embed/liveboard.d.ts +13 -164
  57. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  58. package/cjs/src/embed/liveboard.js +72 -135
  59. package/cjs/src/embed/liveboard.js.map +1 -1
  60. package/cjs/src/embed/liveboard.spec.js +213 -29
  61. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  62. package/cjs/src/embed/search-bar.js +1 -1
  63. package/cjs/src/embed/search-bar.js.map +1 -1
  64. package/cjs/src/embed/search.d.ts +14 -0
  65. package/cjs/src/embed/search.d.ts.map +1 -1
  66. package/cjs/src/embed/search.js +5 -2
  67. package/cjs/src/embed/search.js.map +1 -1
  68. package/cjs/src/embed/search.spec.js +85 -0
  69. package/cjs/src/embed/search.spec.js.map +1 -1
  70. package/cjs/src/embed/spotter-utils.d.ts +8 -1
  71. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  72. package/cjs/src/embed/spotter-utils.js +14 -1
  73. package/cjs/src/embed/spotter-utils.js.map +1 -1
  74. package/cjs/src/embed/spotter-utils.spec.js +26 -0
  75. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  76. package/cjs/src/embed/ts-embed.d.ts +20 -22
  77. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  78. package/cjs/src/embed/ts-embed.js +171 -66
  79. package/cjs/src/embed/ts-embed.js.map +1 -1
  80. package/cjs/src/embed/ts-embed.spec.js +486 -38
  81. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  82. package/cjs/src/errors.js +1 -1
  83. package/cjs/src/errors.js.map +1 -1
  84. package/cjs/src/full-height.d.ts +137 -0
  85. package/cjs/src/full-height.d.ts.map +1 -0
  86. package/cjs/src/full-height.js +272 -0
  87. package/cjs/src/full-height.js.map +1 -0
  88. package/cjs/src/full-height.spec.d.ts +2 -0
  89. package/cjs/src/full-height.spec.d.ts.map +1 -0
  90. package/cjs/src/full-height.spec.js +835 -0
  91. package/cjs/src/full-height.spec.js.map +1 -0
  92. package/cjs/src/index.d.ts +5 -3
  93. package/cjs/src/index.d.ts.map +1 -1
  94. package/cjs/src/index.js +6 -4
  95. package/cjs/src/index.js.map +1 -1
  96. package/cjs/src/react/all-types-export.d.ts +1 -1
  97. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  98. package/cjs/src/react/all-types-export.js +2 -1
  99. package/cjs/src/react/all-types-export.js.map +1 -1
  100. package/cjs/src/react/all-types-export.parity.spec.js +55 -3
  101. package/cjs/src/react/all-types-export.parity.spec.js.map +1 -1
  102. package/cjs/src/types.d.ts +584 -24
  103. package/cjs/src/types.d.ts.map +1 -1
  104. package/cjs/src/types.js +370 -22
  105. package/cjs/src/types.js.map +1 -1
  106. package/cjs/src/utils/authService/tokenizedAuthService.spec.js +2 -1
  107. package/cjs/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  108. package/cjs/src/utils/custom-actions.spec.js +4 -2
  109. package/cjs/src/utils/custom-actions.spec.js.map +1 -1
  110. package/cjs/src/utils/filterConverter.d.ts +106 -0
  111. package/cjs/src/utils/filterConverter.d.ts.map +1 -0
  112. package/cjs/src/utils/filterConverter.js +215 -0
  113. package/cjs/src/utils/filterConverter.js.map +1 -0
  114. package/cjs/src/utils/filterConverter.spec.d.ts +2 -0
  115. package/cjs/src/utils/filterConverter.spec.d.ts.map +1 -0
  116. package/cjs/src/utils/filterConverter.spec.js +709 -0
  117. package/cjs/src/utils/filterConverter.spec.js.map +1 -0
  118. package/cjs/src/utils/processData.spec.js +2 -1
  119. package/cjs/src/utils/processData.spec.js.map +1 -1
  120. package/cjs/src/utils/processTrigger.d.ts +3 -1
  121. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  122. package/cjs/src/utils/processTrigger.js +19 -51
  123. package/cjs/src/utils/processTrigger.js.map +1 -1
  124. package/cjs/src/utils/transport/iframe-transport.d.ts +55 -0
  125. package/cjs/src/utils/transport/iframe-transport.d.ts.map +1 -0
  126. package/cjs/src/utils/transport/iframe-transport.js +108 -0
  127. package/cjs/src/utils/transport/iframe-transport.js.map +1 -0
  128. package/cjs/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  129. package/cjs/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  130. package/cjs/src/utils/transport/iframe-transport.spec.js +140 -0
  131. package/cjs/src/utils/transport/iframe-transport.spec.js.map +1 -0
  132. package/cjs/src/utils.d.ts +18 -0
  133. package/cjs/src/utils.d.ts.map +1 -1
  134. package/cjs/src/utils.js +39 -1
  135. package/cjs/src/utils.js.map +1 -1
  136. package/cjs/src/utils.spec.js +62 -0
  137. package/cjs/src/utils.spec.js.map +1 -1
  138. package/dist/{index-BMppCU63.js → index-CcBYlGo9.js} +1 -1
  139. package/dist/src/contracts/contracts.spec.d.ts +2 -0
  140. package/dist/src/contracts/contracts.spec.d.ts.map +1 -0
  141. package/dist/src/contracts/embed-event-payloads.d.ts +73 -0
  142. package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -0
  143. package/dist/src/contracts/host-event-contracts.d.ts +416 -0
  144. package/dist/src/contracts/host-event-contracts.d.ts.map +1 -0
  145. package/dist/src/contracts/index.d.ts +22 -0
  146. package/dist/src/contracts/index.d.ts.map +1 -0
  147. package/dist/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  148. package/dist/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  149. package/dist/src/embed/app.d.ts +21 -143
  150. package/dist/src/embed/app.d.ts.map +1 -1
  151. package/dist/src/embed/conversation.d.ts +1 -0
  152. package/dist/src/embed/conversation.d.ts.map +1 -1
  153. package/dist/src/embed/hostEventClient/host-event-client.d.ts +5 -4
  154. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  155. package/dist/src/embed/hostEventClient/utils.d.ts +10 -1
  156. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  157. package/dist/src/embed/liveboard.d.ts +13 -164
  158. package/dist/src/embed/liveboard.d.ts.map +1 -1
  159. package/dist/src/embed/search.d.ts +14 -0
  160. package/dist/src/embed/search.d.ts.map +1 -1
  161. package/dist/src/embed/spotter-utils.d.ts +8 -1
  162. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  163. package/dist/src/embed/ts-embed.d.ts +20 -22
  164. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  165. package/dist/src/full-height.d.ts +137 -0
  166. package/dist/src/full-height.d.ts.map +1 -0
  167. package/dist/src/full-height.spec.d.ts +2 -0
  168. package/dist/src/full-height.spec.d.ts.map +1 -0
  169. package/dist/src/index.d.ts +5 -3
  170. package/dist/src/index.d.ts.map +1 -1
  171. package/dist/src/react/all-types-export.d.ts +1 -1
  172. package/dist/src/react/all-types-export.d.ts.map +1 -1
  173. package/dist/src/types.d.ts +584 -24
  174. package/dist/src/types.d.ts.map +1 -1
  175. package/dist/src/utils/filterConverter.d.ts +106 -0
  176. package/dist/src/utils/filterConverter.d.ts.map +1 -0
  177. package/dist/src/utils/filterConverter.spec.d.ts +2 -0
  178. package/dist/src/utils/filterConverter.spec.d.ts.map +1 -0
  179. package/dist/src/utils/processTrigger.d.ts +3 -1
  180. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  181. package/dist/src/utils/transport/iframe-transport.d.ts +55 -0
  182. package/dist/src/utils/transport/iframe-transport.d.ts.map +1 -0
  183. package/dist/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  184. package/dist/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  185. package/dist/src/utils.d.ts +18 -0
  186. package/dist/src/utils.d.ts.map +1 -1
  187. package/dist/tsembed-react.es.js +1144 -412
  188. package/dist/tsembed-react.js +1143 -411
  189. package/dist/tsembed.es.js +1357 -418
  190. package/dist/tsembed.js +1352 -412
  191. package/dist/visual-embed-sdk-react-full.d.ts +1514 -651
  192. package/dist/visual-embed-sdk-react.d.ts +1351 -632
  193. package/dist/visual-embed-sdk.d.ts +1508 -668
  194. package/lib/package.json +19 -4
  195. package/lib/src/contracts/contracts.spec.d.ts +2 -0
  196. package/lib/src/contracts/contracts.spec.d.ts.map +1 -0
  197. package/lib/src/contracts/contracts.spec.js +342 -0
  198. package/lib/src/contracts/contracts.spec.js.map +1 -0
  199. package/lib/src/contracts/embed-event-payloads.d.ts +73 -0
  200. package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -0
  201. package/lib/src/contracts/embed-event-payloads.js +2 -0
  202. package/lib/src/contracts/embed-event-payloads.js.map +1 -0
  203. package/lib/src/contracts/host-event-contracts.d.ts +416 -0
  204. package/lib/src/contracts/host-event-contracts.d.ts.map +1 -0
  205. package/lib/src/contracts/host-event-contracts.js +2 -0
  206. package/lib/src/contracts/host-event-contracts.js.map +1 -0
  207. package/lib/src/contracts/index.d.ts +22 -0
  208. package/lib/src/contracts/index.d.ts.map +1 -0
  209. package/lib/src/contracts/index.js +22 -0
  210. package/lib/src/contracts/index.js.map +1 -0
  211. package/lib/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  212. package/lib/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  213. package/lib/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
  214. package/lib/src/contracts/ui-passthrough-contracts.js.map +1 -0
  215. package/lib/src/embed/app.d.ts +21 -143
  216. package/lib/src/embed/app.d.ts.map +1 -1
  217. package/lib/src/embed/app.js +23 -123
  218. package/lib/src/embed/app.js.map +1 -1
  219. package/lib/src/embed/app.spec.js +80 -26
  220. package/lib/src/embed/app.spec.js.map +1 -1
  221. package/lib/src/embed/auto-frame-renderer.js +1 -1
  222. package/lib/src/embed/auto-frame-renderer.js.map +1 -1
  223. package/lib/src/embed/auto-frame-renderer.spec.js +24 -13
  224. package/lib/src/embed/auto-frame-renderer.spec.js.map +1 -1
  225. package/lib/src/embed/bodyless-conversation.js +1 -1
  226. package/lib/src/embed/bodyless-conversation.js.map +1 -1
  227. package/lib/src/embed/conversation.d.ts +1 -0
  228. package/lib/src/embed/conversation.d.ts.map +1 -1
  229. package/lib/src/embed/conversation.js +5 -5
  230. package/lib/src/embed/conversation.js.map +1 -1
  231. package/lib/src/embed/conversation.spec.js +35 -24
  232. package/lib/src/embed/conversation.spec.js.map +1 -1
  233. package/lib/src/embed/embedConfig.spec.js +2 -1
  234. package/lib/src/embed/embedConfig.spec.js.map +1 -1
  235. package/lib/src/embed/events.spec.js +12 -2
  236. package/lib/src/embed/events.spec.js.map +1 -1
  237. package/lib/src/embed/hostEventClient/host-event-client.d.ts +5 -4
  238. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  239. package/lib/src/embed/hostEventClient/host-event-client.js +19 -8
  240. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  241. package/lib/src/embed/hostEventClient/host-event-client.spec.js +15 -9
  242. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  243. package/lib/src/embed/hostEventClient/utils.d.ts +10 -1
  244. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  245. package/lib/src/embed/hostEventClient/utils.js +48 -3
  246. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  247. package/lib/src/embed/hostEventClient/utils.spec.js +152 -1
  248. package/lib/src/embed/hostEventClient/utils.spec.js.map +1 -1
  249. package/lib/src/embed/liveboard.d.ts +13 -164
  250. package/lib/src/embed/liveboard.d.ts.map +1 -1
  251. package/lib/src/embed/liveboard.js +73 -136
  252. package/lib/src/embed/liveboard.js.map +1 -1
  253. package/lib/src/embed/liveboard.spec.js +213 -29
  254. package/lib/src/embed/liveboard.spec.js.map +1 -1
  255. package/lib/src/embed/search-bar.js +1 -1
  256. package/lib/src/embed/search-bar.js.map +1 -1
  257. package/lib/src/embed/search.d.ts +14 -0
  258. package/lib/src/embed/search.d.ts.map +1 -1
  259. package/lib/src/embed/search.js +5 -2
  260. package/lib/src/embed/search.js.map +1 -1
  261. package/lib/src/embed/search.spec.js +85 -0
  262. package/lib/src/embed/search.spec.js.map +1 -1
  263. package/lib/src/embed/spotter-utils.d.ts +8 -1
  264. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  265. package/lib/src/embed/spotter-utils.js +12 -0
  266. package/lib/src/embed/spotter-utils.js.map +1 -1
  267. package/lib/src/embed/spotter-utils.spec.js +27 -1
  268. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  269. package/lib/src/embed/ts-embed.d.ts +20 -22
  270. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  271. package/lib/src/embed/ts-embed.js +171 -66
  272. package/lib/src/embed/ts-embed.js.map +1 -1
  273. package/lib/src/embed/ts-embed.spec.js +484 -36
  274. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  275. package/lib/src/errors.js +1 -1
  276. package/lib/src/errors.js.map +1 -1
  277. package/lib/src/full-height.d.ts +137 -0
  278. package/lib/src/full-height.d.ts.map +1 -0
  279. package/lib/src/full-height.js +268 -0
  280. package/lib/src/full-height.js.map +1 -0
  281. package/lib/src/full-height.spec.d.ts +2 -0
  282. package/lib/src/full-height.spec.d.ts.map +1 -0
  283. package/lib/src/full-height.spec.js +833 -0
  284. package/lib/src/full-height.spec.js.map +1 -0
  285. package/lib/src/index.d.ts +5 -3
  286. package/lib/src/index.d.ts.map +1 -1
  287. package/lib/src/index.js +3 -2
  288. package/lib/src/index.js.map +1 -1
  289. package/lib/src/react/all-types-export.d.ts +1 -1
  290. package/lib/src/react/all-types-export.d.ts.map +1 -1
  291. package/lib/src/react/all-types-export.js +1 -1
  292. package/lib/src/react/all-types-export.js.map +1 -1
  293. package/lib/src/react/all-types-export.parity.spec.js +55 -3
  294. package/lib/src/react/all-types-export.parity.spec.js.map +1 -1
  295. package/lib/src/types.d.ts +584 -24
  296. package/lib/src/types.d.ts.map +1 -1
  297. package/lib/src/types.js +370 -22
  298. package/lib/src/types.js.map +1 -1
  299. package/lib/src/utils/authService/tokenizedAuthService.spec.js +2 -1
  300. package/lib/src/utils/authService/tokenizedAuthService.spec.js.map +1 -1
  301. package/lib/src/utils/custom-actions.spec.js +4 -2
  302. package/lib/src/utils/custom-actions.spec.js.map +1 -1
  303. package/lib/src/utils/filterConverter.d.ts +106 -0
  304. package/lib/src/utils/filterConverter.d.ts.map +1 -0
  305. package/lib/src/utils/filterConverter.js +210 -0
  306. package/lib/src/utils/filterConverter.js.map +1 -0
  307. package/lib/src/utils/filterConverter.spec.d.ts +2 -0
  308. package/lib/src/utils/filterConverter.spec.d.ts.map +1 -0
  309. package/lib/src/utils/filterConverter.spec.js +707 -0
  310. package/lib/src/utils/filterConverter.spec.js.map +1 -0
  311. package/lib/src/utils/processData.spec.js +2 -1
  312. package/lib/src/utils/processData.spec.js.map +1 -1
  313. package/lib/src/utils/processTrigger.d.ts +3 -1
  314. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  315. package/lib/src/utils/processTrigger.js +19 -51
  316. package/lib/src/utils/processTrigger.js.map +1 -1
  317. package/lib/src/utils/transport/iframe-transport.d.ts +55 -0
  318. package/lib/src/utils/transport/iframe-transport.d.ts.map +1 -0
  319. package/lib/src/utils/transport/iframe-transport.js +101 -0
  320. package/lib/src/utils/transport/iframe-transport.js.map +1 -0
  321. package/lib/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  322. package/lib/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  323. package/lib/src/utils/transport/iframe-transport.spec.js +138 -0
  324. package/lib/src/utils/transport/iframe-transport.spec.js.map +1 -0
  325. package/lib/src/utils.d.ts +18 -0
  326. package/lib/src/utils.d.ts.map +1 -1
  327. package/lib/src/utils.js +37 -0
  328. package/lib/src/utils.js.map +1 -1
  329. package/lib/src/utils.spec.js +63 -1
  330. package/lib/src/utils.spec.js.map +1 -1
  331. package/lib/src/visual-embed-sdk.d.ts +1508 -668
  332. package/package.json +19 -4
  333. package/src/contracts/contracts.spec.ts +392 -0
  334. package/src/contracts/embed-event-payloads.ts +83 -0
  335. package/src/contracts/host-event-contracts.ts +500 -0
  336. package/src/contracts/index.ts +53 -0
  337. package/src/contracts/ui-passthrough-contracts.ts +301 -0
  338. package/src/embed/app.spec.ts +101 -34
  339. package/src/embed/app.ts +42 -268
  340. package/src/embed/auto-frame-renderer.spec.ts +24 -13
  341. package/src/embed/auto-frame-renderer.ts +1 -1
  342. package/src/embed/bodyless-conversation.ts +1 -1
  343. package/src/embed/conversation.spec.ts +38 -27
  344. package/src/embed/conversation.ts +5 -5
  345. package/src/embed/embedConfig.spec.ts +2 -1
  346. package/src/embed/events.spec.ts +14 -2
  347. package/src/embed/hostEventClient/host-event-client.spec.ts +16 -10
  348. package/src/embed/hostEventClient/host-event-client.ts +31 -10
  349. package/src/embed/hostEventClient/utils.spec.ts +176 -1
  350. package/src/embed/hostEventClient/utils.ts +53 -3
  351. package/src/embed/liveboard.spec.ts +261 -41
  352. package/src/embed/liveboard.ts +85 -300
  353. package/src/embed/search-bar.tsx +1 -1
  354. package/src/embed/search.spec.ts +103 -0
  355. package/src/embed/search.ts +21 -1
  356. package/src/embed/spotter-utils.spec.ts +29 -0
  357. package/src/embed/spotter-utils.ts +16 -0
  358. package/src/embed/ts-embed.spec.ts +650 -36
  359. package/src/embed/ts-embed.ts +205 -76
  360. package/src/errors.ts +1 -1
  361. package/src/full-height.spec.ts +1008 -0
  362. package/src/full-height.ts +361 -0
  363. package/src/index.ts +103 -5
  364. package/src/react/all-types-export.parity.spec.ts +63 -3
  365. package/src/react/all-types-export.ts +49 -0
  366. package/src/types.ts +584 -22
  367. package/src/utils/authService/tokenizedAuthService.spec.ts +2 -1
  368. package/src/utils/custom-actions.spec.ts +4 -2
  369. package/src/utils/filterConverter.spec.ts +801 -0
  370. package/src/utils/filterConverter.ts +304 -0
  371. package/src/utils/processData.spec.ts +2 -1
  372. package/src/utils/processTrigger.ts +28 -58
  373. package/src/utils/transport/iframe-transport.spec.ts +177 -0
  374. package/src/utils/transport/iframe-transport.ts +122 -0
  375. package/src/utils.spec.ts +71 -0
  376. package/src/utils.ts +38 -0
  377. package/cjs/src/embed/hostEventClient/contracts.d.ts +0 -231
  378. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  379. package/cjs/src/embed/hostEventClient/contracts.js.map +0 -1
  380. package/dist/src/embed/hostEventClient/contracts.d.ts +0 -231
  381. package/dist/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  382. package/lib/src/embed/hostEventClient/contracts.d.ts +0 -231
  383. package/lib/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  384. package/lib/src/embed/hostEventClient/contracts.js.map +0 -1
  385. package/src/embed/hostEventClient/contracts.ts +0 -262
@@ -1,6 +1,6 @@
1
1
  import { Param, BaseViewConfig, RuntimeFilter, RuntimeParameter, ErrorDetailsTypes, EmbedErrorCodes, DefaultAppInitData, VisualizationOverrides, SpotterFileUploadFileTypes } from '../types';
2
2
  import { TsEmbed } from './ts-embed';
3
- import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData, buildStarterPromptsAppInitData } from './spotter-utils';
3
+ import { buildSpotterSidebarAppInitData, buildSpotterShareConversationAppInitData, buildStarterPromptsAppInitData, buildSpotterAnalystAppInitData } from './spotter-utils';
4
4
  import { getQueryParamString, getFilterQuery, getRuntimeParameters, setParamIfDefined } from '../utils';
5
5
 
6
6
  /**
@@ -801,6 +801,7 @@ export interface SpotterAppInitData extends DefaultAppInitData {
801
801
  spotterShareConversationConfig?: SpotterShareConversationConfig;
802
802
  visualOverridesParams?: VisualizationOverrides | null;
803
803
  starterPrompts?: StarterPromptsConfig;
804
+ spotterAnalystConfig?: SpotterAnalystConfig;
804
805
  };
805
806
  }
806
807
 
@@ -850,7 +851,8 @@ export class SpotterEmbed extends TsEmbed {
850
851
  this.handleError.bind(this),
851
852
  );
852
853
  const shareInitData = buildSpotterShareConversationAppInitData(sidebarInitData, this.viewConfig);
853
- return buildStarterPromptsAppInitData(shareInitData, this.viewConfig);
854
+ const starterPromptsInitData = buildStarterPromptsAppInitData(shareInitData, this.viewConfig);
855
+ return buildSpotterAnalystAppInitData(starterPromptsInitData, this.viewConfig);
854
856
  }
855
857
 
856
858
  protected getEmbedParamsObject() {
@@ -871,7 +873,6 @@ export class SpotterEmbed extends TsEmbed {
871
873
  defaultQueryMode,
872
874
  enableStopAnswerGenerationEmbed,
873
875
  spotterChatConfig,
874
- spotterAnalystConfig,
875
876
  } = this.viewConfig;
876
877
 
877
878
  const queryParams = this.getBaseQueryParams();
@@ -887,7 +888,6 @@ export class SpotterEmbed extends TsEmbed {
887
888
  setParamIfDefined(queryParams, Param.ShowSpotterRadiance, showSpotterRadiance, true);
888
889
  setParamIfDefined(queryParams, Param.DefaultQueryMode, defaultQueryMode);
889
890
  setParamIfDefined(queryParams, Param.EnableStopAnswerGenerationEmbed, enableStopAnswerGenerationEmbed, true);
890
- setParamIfDefined(queryParams, Param.AnalystId, spotterAnalystConfig?.analystId);
891
891
 
892
892
  // Handle spotterChatConfig params
893
893
  if (spotterChatConfig) {
@@ -931,7 +931,7 @@ export class SpotterEmbed extends TsEmbed {
931
931
  const path = sharedConversationId
932
932
  ? `insights/conv-assist/s/${encodeURIComponent(sharedConversationId)}`
933
933
  : 'insights/conv-assist';
934
- const queryParams = this.getEmbedParamsObject();
934
+ const queryParams = this.getUrlQueryParamsObject();
935
935
 
936
936
  let query = '';
937
937
  const queryParamsString = getQueryParamString(queryParams, true);
@@ -3,7 +3,8 @@ import { storeValueInWindow, resetValueFromWindow } from '../utils';
3
3
 
4
4
  describe('embedConfig', () => {
5
5
  beforeEach(() => {
6
- // Ensure the SDK window namespace exists before resetting individual keys
6
+ // Ensure the SDK window namespace exists before resetting individual
7
+ // keys
7
8
  storeValueInWindow('embedConfig', undefined);
8
9
  resetValueFromWindow('embedConfig');
9
10
  });
@@ -9,6 +9,7 @@ import {
9
9
  LiveboardEmbed,
10
10
  AppEmbed,
11
11
  HostEvent,
12
+ MessageCallback,
12
13
  } from '../index';
13
14
  import {
14
15
  EVENT_WAIT_TIME,
@@ -139,7 +140,7 @@ describe('test communication between host app and ThoughtSpot', () => {
139
140
  searchEmbed.render();
140
141
  setTimeout(() => {
141
142
  searchEmbed.trigger(HostEvent.Search, {
142
- body: PAYLOAD,
143
+ searchQuery: PAYLOAD,
143
144
  });
144
145
  }, EVENT_WAIT_TIME);
145
146
  executeAfterWait(() => {
@@ -147,12 +148,23 @@ describe('test communication between host app and ThoughtSpot', () => {
147
148
 
148
149
  iframe.contentWindow.addEventListener('message', (e) => {
149
150
  expect(e.data.type).toBe(HostEvent.Search);
150
- expect(e.data.data.body).toBe(PAYLOAD);
151
+ expect(e.data.data.searchQuery).toBe(PAYLOAD);
151
152
  done();
152
153
  });
153
154
  });
154
155
  });
155
156
 
157
+ test('accepts a MessageCallback-typed handler for typed and untyped events', () => {
158
+ // Guardrail: on()/off() must accept the public MessageCallback type, or
159
+ // existing customer handlers stop compiling (checked non-strict here).
160
+ const legacy: MessageCallback = jest.fn();
161
+ const searchEmbed = new SearchEmbed(getRootEl(), {});
162
+ searchEmbed.on(EmbedEvent.CustomAction, legacy); // typed event
163
+ searchEmbed.on(EmbedEvent.Data, legacy); // untyped event
164
+ searchEmbed.off(EmbedEvent.Data, legacy);
165
+ expect(legacy).not.toHaveBeenCalled();
166
+ });
167
+
156
168
  test('should execute multiple event handlers if registered', async () => {
157
169
  const handlerOne = jest.fn();
158
170
  const handlerTwo = jest.fn();
@@ -6,8 +6,8 @@ import {
6
6
  UIPassthroughEvent,
7
7
  UIPassthroughRequest,
8
8
  UIPassthroughArrayResponse,
9
- HostEventRequest,
10
- } from './contracts';
9
+ } from '../../contracts/ui-passthrough-contracts';
10
+ import { HostEventRequest } from '../../contracts/host-event-contracts';
11
11
  import { HostEventClient } from './host-event-client';
12
12
 
13
13
  jest.mock('../../utils/processTrigger');
@@ -979,11 +979,14 @@ describe('HostEventClient', () => {
979
979
  const { client } = createHostEventClient();
980
980
  mockProcessTrigger.mockReset();
981
981
 
982
- // Flow per triggerHostEvent call when GetAvailableUIPassthroughs rejects:
983
- // 1. getAvailableUIPassthroughKeys → processTrigger(UIPassthrough, GetAvailableUIPassthroughs) → rejects → returns []
984
- // 2. keys=[] so getDataWithPassthroughFallback is called →
985
- // triggerUIPassthroughApi(GetAnswerSession) → processTrigger(UIPassthrough) → null → hostEventFallback called
986
- // 3. hostEventFallback → processTrigger(GetAnswerSession) → legacy result
982
+ // Flow per triggerHostEvent call when GetAvailableUIPassthroughs
983
+ // rejects: 1. getAvailableUIPassthroughKeys →
984
+ // processTrigger(UIPassthrough, GetAvailableUIPassthroughs) →
985
+ // rejects → returns [] 2. keys=[] so getDataWithPassthroughFallback
986
+ // is called → triggerUIPassthroughApi(GetAnswerSession) →
987
+ // processTrigger(UIPassthrough) → null → hostEventFallback called
988
+ // 3. hostEventFallback → processTrigger(GetAnswerSession) → legacy
989
+ // result
987
990
 
988
991
  // First triggerHostEvent: 3 calls
989
992
  mockProcessTrigger.mockRejectedValueOnce(new Error('network error')); // call 1
@@ -992,14 +995,16 @@ describe('HostEventClient', () => {
992
995
 
993
996
  await client.triggerHostEvent(HostEvent.GetAnswerSession, { vizId: '1' });
994
997
 
995
- // Second triggerHostEvent: cache was NOT set, so GetAvailableUIPassthroughs is retried: 3 more calls
998
+ // Second triggerHostEvent: cache was NOT set, so
999
+ // GetAvailableUIPassthroughs is retried: 3 more calls
996
1000
  mockProcessTrigger.mockRejectedValueOnce(new Error('network error')); // call 4
997
1001
  mockProcessTrigger.mockResolvedValueOnce(null); // call 5
998
1002
  mockProcessTrigger.mockResolvedValueOnce({ session: 'leg2' }); // call 6
999
1003
 
1000
1004
  await client.triggerHostEvent(HostEvent.GetAnswerSession, { vizId: '2' });
1001
1005
 
1002
- // 6 total calls: GetAvailableUIPassthroughs was called TWICE (cache not set after catch)
1006
+ // 6 total calls: GetAvailableUIPassthroughs was called TWICE
1007
+ // (cache not set after catch)
1003
1008
  expect(mockProcessTrigger).toHaveBeenCalledTimes(6);
1004
1009
  const availableCallsCount = mockProcessTrigger.mock.calls.filter(
1005
1010
  (call) => call[3]?.type === UIPassthroughEvent.GetAvailableUIPassthroughs,
@@ -1175,7 +1180,8 @@ describe('HostEventClient', () => {
1175
1180
  { numberOfTabs: number; orderedTabIds: string[] }
1176
1181
  > = true;
1177
1182
  const probeUnknownField = (r: TabsResponse) =>
1178
- // @ts-expect-error — field not on the GetTabs contract (was silent when `any`)
1183
+ // @ts-expect-error — field not on the GetTabs contract (was
1184
+ // silent when `any`)
1179
1185
  r.tabCount;
1180
1186
  void probeUnknownField;
1181
1187
 
@@ -3,6 +3,7 @@ import { processTrigger as processTriggerService } from '../../utils/processTrig
3
3
  import { getEmbedConfig } from '../embedConfig';
4
4
  import {
5
5
  isValidUpdateFiltersPayload,
6
+ resolveUpdateFiltersAliases,
6
7
  isValidUpdateParametersPayload,
7
8
  isValidDrillDownPayload,
8
9
  throwUpdateFiltersValidationError,
@@ -12,18 +13,23 @@ import {
12
13
  import {
13
14
  UIPassthroughArrayResponse,
14
15
  UIPassthroughEvent,
15
- HostEventRequest,
16
- HostEventResponse,
17
16
  UIPassthroughRequest,
18
17
  UIPassthroughResponse,
18
+ } from '../../contracts/ui-passthrough-contracts';
19
+ // Contract resolution from the shared contracts module — see
20
+ // src/contracts/host-event-contracts.ts (single source of truth).
21
+ import {
22
+ HostEventRequest,
23
+ HostEventResponse,
19
24
  TriggerPayload,
20
25
  TriggerResponse,
21
- } from './contracts';
26
+ } from '../../contracts/host-event-contracts';
22
27
 
23
28
  /**
24
29
  * Maps HostEvent to its corresponding UIPassthroughEvent.
25
30
  * Includes both custom-handler events (Pin, SaveAnswer, UpdateFilters, DrillDown)
26
- * and getter events (GetAnswerSession, GetFilters, etc.) that use getDataWithPassthroughFallback.
31
+ * and getter events (GetAnswerSession, GetFilters, etc.) that use
32
+ * getDataWithPassthroughFallback.
27
33
  */
28
34
  const PASSTHROUGH_MAP: Partial<Record<HostEvent, UIPassthroughEvent>> = {
29
35
  // Custom handlers (setters with special logic)
@@ -244,7 +250,20 @@ export class HostEventClient {
244
250
  throwUpdateFiltersValidationError();
245
251
  }
246
252
 
247
- return this.handleHostEventWithParam(UIPassthroughEvent.UpdateFilters, payload, context as ContextType);
253
+ // The shared contract accepts both current (columnName/operator) and
254
+ // legacy (column/oper) filter field names, but only the legacy pair is
255
+ // understood downstream, so the payload is rewritten before it is
256
+ // forwarded — otherwise a columnName/operator filter passes validation
257
+ // here and is then silently ignored by the app. The cast bridges the
258
+ // UIPassthrough FilterUpdate type, which still declares only the legacy
259
+ // names.
260
+ const resolvedPayload = resolveUpdateFiltersAliases(payload);
261
+
262
+ return this.handleHostEventWithParam(
263
+ UIPassthroughEvent.UpdateFilters,
264
+ resolvedPayload as UIPassthroughRequest<UIPassthroughEvent.UpdateFilters>,
265
+ context as ContextType,
266
+ );
248
267
  }
249
268
 
250
269
  protected handleUpdateParametersEvent(
@@ -255,7 +274,8 @@ export class HostEventClient {
255
274
  throwUpdateParametersValidationError();
256
275
  }
257
276
 
258
- // UpdateParameters has no UI passthrough contract; dispatch over the legacy channel
277
+ // UpdateParameters has no UI passthrough contract; dispatch over the
278
+ // legacy channel
259
279
  return this.hostEventFallback(HostEvent.UpdateParameters, payload, context);
260
280
  }
261
281
 
@@ -272,8 +292,8 @@ export class HostEventClient {
272
292
 
273
293
  /**
274
294
  * Dispatches a host event using the appropriate channel:
275
- * 1. If the embedded app supports UI passthrough for this event, use it (custom handler or getter).
276
- * 2. Otherwise fall back to the legacy host event channel.
295
+ * 1. If the embedded app supports UI passthrough for this event, use it (custom
296
+ * handler or getter). 2. Otherwise fall back to the legacy host event channel.
277
297
  *
278
298
  * @param hostEvent - The host event to trigger
279
299
  * @param payload - Optional payload for the event
@@ -287,11 +307,12 @@ export class HostEventClient {
287
307
  hostEvent: HostEventT,
288
308
  payload?: TriggerPayload<PayloadT, HostEventT>,
289
309
  context?: ContextT,
290
- ): Promise<TriggerResponse<PayloadT, HostEventT, ContextType>> {
310
+ ): Promise<TriggerResponse<PayloadT, HostEventT, ContextT>> {
291
311
  const customHandler = this.customHandlers[hostEvent];
292
312
  const passthroughEvent = PASSTHROUGH_MAP[hostEvent];
293
313
 
294
- // If embedded app supports passthrough but not this event, use legacy channel
314
+ // If embedded app supports passthrough but not this event, use legacy
315
+ // channel
295
316
  const keys = passthroughEvent ? await this.getAvailableUIPassthroughKeys(context as ContextType) : [];
296
317
  if (passthroughEvent && keys.length > 0 && !keys.includes(passthroughEvent)) {
297
318
  return this.hostEventFallback(hostEvent, payload, context) as any;
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  isValidUpdateFiltersPayload,
3
+ resolveUpdateFiltersAliases,
3
4
  isValidUpdateParametersPayload,
4
5
  isValidDrillDownPayload,
5
6
  createValidationError,
@@ -7,6 +8,7 @@ import {
7
8
  throwUpdateParametersValidationError,
8
9
  throwDrillDownValidationError,
9
10
  } from './utils';
11
+ import { HostFilterUpdate as FilterUpdate } from '../../contracts/host-event-contracts';
10
12
  import { ERROR_MESSAGE } from '../../errors';
11
13
  import { EmbedEvent } from '../../types';
12
14
  import { embedEventStatus } from '../../utils';
@@ -426,4 +428,177 @@ describe('hostEventClient utils', () => {
426
428
  .toThrow(ERROR_MESSAGE.DRILLDOWN_INVALID_PAYLOAD);
427
429
  });
428
430
  });
429
- });
431
+ // =========================
432
+ // FilterUpdate type shape
433
+ // =========================
434
+ // The @ts-expect-error assertions below are enforced by tsc: an unused one
435
+ // is itself an error, so re-loosening the type fails the build.
436
+ describe('FilterUpdate type', () => {
437
+ it('accepts the documented columnName/operator spelling', () => {
438
+ const filter: FilterUpdate = { columnName: 'region', operator: 'EQ', values: ['west'] };
439
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
440
+ });
441
+
442
+ it('still accepts the deprecated column/oper aliases', () => {
443
+ const filter: FilterUpdate = { column: 'region', oper: 'EQ', values: ['west'] };
444
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
445
+ });
446
+
447
+ it('accepts a mix of documented and deprecated spellings', () => {
448
+ const filter: FilterUpdate = { columnName: 'region', oper: 'EQ', values: ['west'] };
449
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
450
+ });
451
+
452
+ it('accepts a worksheet-qualified column name', () => {
453
+ const filter: FilterUpdate = {
454
+ columnName: '(Sample) Retail - Apparel::city',
455
+ operator: 'IN',
456
+ values: ['atlanta'],
457
+ };
458
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
459
+ });
460
+
461
+ it('rejects a filter with no column at compile time and at runtime', () => {
462
+ // @ts-expect-error one of columnName/column is required
463
+ const filter: FilterUpdate = { operator: 'EQ', values: ['west'] };
464
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(false);
465
+ });
466
+
467
+ it('rejects a filter with no operator at compile time and at runtime', () => {
468
+ // @ts-expect-error one of operator/oper is required
469
+ const filter: FilterUpdate = { columnName: 'region', values: ['west'] };
470
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(false);
471
+ });
472
+
473
+ it('rejects both column spellings at compile time', () => {
474
+ // @ts-expect-error columnName and column are mutually exclusive
475
+ const filter: FilterUpdate = {
476
+ columnName: 'region', column: 'region', operator: 'EQ', values: ['west'],
477
+ };
478
+ // The runtime validator is laxer than the type - it reads whichever
479
+ // spelling is present - so this still passes at runtime. The point
480
+ // of the type is to stop the ambiguity reaching it.
481
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
482
+ });
483
+
484
+ it('rejects both operator spellings at compile time', () => {
485
+ // @ts-expect-error operator and oper are mutually exclusive
486
+ const filter: FilterUpdate = {
487
+ columnName: 'region', operator: 'EQ', oper: 'EQ', values: ['west'],
488
+ };
489
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
490
+ });
491
+
492
+ // The fields SCAL-325540 added to the host-event contract have to keep
493
+ // working alongside the exclusive alias pairs - the union must widen
494
+ // the column and operator halves only, and leave the rest of the
495
+ // filter shape alone.
496
+ it('accepts the fields added by the host-event contract', () => {
497
+ const filter: FilterUpdate = {
498
+ columnName: 'date',
499
+ columnId: 'col-guid',
500
+ operator: 'EQ',
501
+ values: ['2023-07-31'],
502
+ type: 'EXACT_DATE',
503
+ datePeriod: 'DAY',
504
+ negate: true,
505
+ applicability: { level: 'TAB', targetId: 'tab-guid' },
506
+ };
507
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
508
+ });
509
+
510
+ it('accepts non-string values alongside the documented spelling', () => {
511
+ const filter: FilterUpdate = {
512
+ columnName: 'quantity', operator: 'GE', values: [5, true],
513
+ };
514
+ expect(isValidUpdateFiltersPayload({ filter })).toBe(true);
515
+ });
516
+
517
+ it('accepts the request-level scoping fields', () => {
518
+ const payload = {
519
+ filters: [{ columnName: 'region', operator: 'IN', values: ['west'] }],
520
+ visualizationId: 'viz-guid',
521
+ liveboardId: 'lb-guid',
522
+ };
523
+ expect(isValidUpdateFiltersPayload(payload)).toBe(true);
524
+ });
525
+ });
526
+ describe('resolveUpdateFiltersAliases', () => {
527
+ it('rewrites columnName/operator to column/oper on a single filter', () => {
528
+ const out = resolveUpdateFiltersAliases({
529
+ filter: { columnName: 'region', operator: 'EQ', values: ['west'] },
530
+ } as any);
531
+
532
+ expect(out.filter).toEqual({ column: 'region', oper: 'EQ', values: ['west'] });
533
+ expect(out.filter).not.toHaveProperty('columnName');
534
+ expect(out.filter).not.toHaveProperty('operator');
535
+ });
536
+
537
+ it('rewrites every entry in a filters array', () => {
538
+ const out = resolveUpdateFiltersAliases({
539
+ filters: [
540
+ { columnName: 'region', operator: 'EQ', values: ['west'] },
541
+ { columnName: 'item type', operator: 'IN', values: ['bags'] },
542
+ ],
543
+ } as any);
544
+
545
+ expect(out.filters).toEqual([
546
+ { column: 'region', oper: 'EQ', values: ['west'] },
547
+ { column: 'item type', oper: 'IN', values: ['bags'] },
548
+ ]);
549
+ });
550
+
551
+ it('leaves a payload that already uses column/oper untouched', () => {
552
+ const payload = { filter: { column: 'region', oper: 'EQ', values: ['west'] } } as any;
553
+
554
+ expect(resolveUpdateFiltersAliases(payload)).toEqual(payload);
555
+ });
556
+
557
+ it('prefers columnName/operator when both spellings are present', () => {
558
+ const out = resolveUpdateFiltersAliases({
559
+ filter: {
560
+ column: 'from-column', columnName: 'from-columnName',
561
+ oper: 'EQ', operator: 'IN',
562
+ values: ['x'],
563
+ },
564
+ } as any);
565
+
566
+ // The value survives under the wire name, but it is the documented
567
+ // spelling's value that survives.
568
+ expect(out.filter).toEqual({ column: 'from-columnName', oper: 'IN', values: ['x'] });
569
+ });
570
+
571
+ it('preserves the other filter fields, including applicability', () => {
572
+ const out = resolveUpdateFiltersAliases({
573
+ filter: {
574
+ columnName: 'date',
575
+ operator: 'EQ',
576
+ values: [1700000000],
577
+ type: 'EXACT_DATE',
578
+ applicability: { level: 'TAB', targetId: 'tab-guid' },
579
+ },
580
+ } as any);
581
+
582
+ expect(out.filter).toEqual({
583
+ column: 'date',
584
+ oper: 'EQ',
585
+ values: [1700000000],
586
+ type: 'EXACT_DATE',
587
+ applicability: { level: 'TAB', targetId: 'tab-guid' },
588
+ });
589
+ });
590
+
591
+ it('produces a payload that still passes validation', () => {
592
+ const out = resolveUpdateFiltersAliases({
593
+ filters: [{ columnName: 'region', operator: 'EQ', values: ['west'] }],
594
+ } as any);
595
+
596
+ expect(isValidUpdateFiltersPayload(out as any)).toBe(true);
597
+ });
598
+
599
+ it('is a no-op on a non-object payload', () => {
600
+ expect(resolveUpdateFiltersAliases(undefined as any)).toBeUndefined();
601
+ expect(resolveUpdateFiltersAliases(null as any)).toBeNull();
602
+ });
603
+ });
604
+ });
@@ -4,12 +4,14 @@ import isString from 'lodash/isString';
4
4
  import isUndefined from 'lodash/isUndefined';
5
5
  import { EmbedErrorCodes, EmbedEvent, ErrorDetailsTypes, HostEvent } from '../../types';
6
6
  import { ERROR_MESSAGE } from '../../errors';
7
- import { ApplicabilityLevel, HostEventRequest } from './contracts';
7
+ import { ApplicabilityLevel } from '../../contracts/ui-passthrough-contracts';
8
+ import { HostEventRequest } from '../../contracts/host-event-contracts';
8
9
  import { embedEventStatus } from '../../utils';
9
10
 
10
11
  const isValidApplicability = (a?: { level?: string; targetId?: string }) => {
11
12
  if (isUndefined(a)) return true;
12
- // targetId is not required at LIVEBOARD level, since the filter applies to the whole Liveboard
13
+ // targetId is not required at LIVEBOARD level, since the filter applies to
14
+ // the whole Liveboard
13
15
  return isPlainObject(a)
14
16
  && Object.values(ApplicabilityLevel).includes(a.level as ApplicabilityLevel)
15
17
  && (a.level === ApplicabilityLevel.Liveboard || (isString(a.targetId) && a.targetId.trim().length > 0));
@@ -43,8 +45,56 @@ export function isValidUpdateFiltersPayload(
43
45
  return !!(hasValidFilter || hasValidFilters);
44
46
  }
45
47
 
48
+ /**
49
+ * Rewrites one filter's `columnName`/`operator` to `column`/`oper`.
50
+ *
51
+ * Callers may use either spelling: `columnName`/`operator` match
52
+ * {@link RuntimeFilter} and the `EmbedEvent.FilterChanged` payload, so a
53
+ * converted payload can be replayed as-is. But the payload is forwarded to the
54
+ * embedded app unchanged, and only `column`/`oper` are known to be understood
55
+ * there - so the alias must be swapped here, or it would pass validation and
56
+ * then be silently ignored.
57
+ *
58
+ * If a caller supplies both spellings of a field - which TypeScript rejects,
59
+ * but JavaScript callers can still do - the documented `columnName`/`operator`
60
+ * wins. Deferring to the deprecated spelling would quietly discard the value
61
+ * the rest of the SDK tells people to use.
62
+ * @param filter One entry from the UpdateFilters payload.
63
+ */
64
+ function resolveFilterAliases<T extends { column?: string; columnName?: string; oper?: string; operator?: string }>(
65
+ filter: T,
66
+ ): T {
67
+ if (!isPlainObject(filter)) return filter;
68
+
69
+ const column = filter.columnName ?? filter.column;
70
+ const oper = filter.operator ?? filter.oper;
71
+ const { columnName, operator, ...rest } = filter;
72
+
73
+ return {
74
+ ...rest,
75
+ ...(isUndefined(column) ? {} : { column }),
76
+ ...(isUndefined(oper) ? {} : { oper }),
77
+ } as T;
78
+ }
79
+
80
+ /**
81
+ * Rewrites every filter in an UpdateFilters payload to use `column`/`oper`,
82
+ * whichever spelling the caller supplied. Call after validation.
83
+ * @param payload The UpdateFilters host event payload.
84
+ */
85
+ export function resolveUpdateFiltersAliases<T extends { filter?: any; filters?: any[] }>(payload: T): T {
86
+ if (!isPlainObject(payload)) return payload;
87
+
88
+ return {
89
+ ...payload,
90
+ ...(payload.filter ? { filter: resolveFilterAliases(payload.filter) } : {}),
91
+ ...(Array.isArray(payload.filters) ? { filters: payload.filters.map(resolveFilterAliases) } : {}),
92
+ };
93
+ }
94
+
46
95
  export function isValidUpdateParametersPayload(payload: unknown): boolean {
47
- // Only validates the applicability of each parameter (null treated as absent); the rest is forwarded as-is for backward compatibility.
96
+ // Only validates the applicability of each parameter (null treated as
97
+ // absent); the rest is forwarded as-is for backward compatibility.
48
98
  if (!Array.isArray(payload)) return true;
49
99
  return payload.every((p) => {
50
100
  if (!isPlainObject(p)) return true;