@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
@@ -0,0 +1,707 @@
1
+ import { RuntimeFilterOp } from '../types';
2
+ import { isValidUpdateFiltersPayload } from '../embed/hostEventClient/utils';
3
+ import { convertFilterChangedToUpdateFiltersPayload } from './filterConverter';
4
+ describe('convertFilterChangedToUpdateFiltersPayload', () => {
5
+ test('returns an empty filters array for an empty payload', () => {
6
+ expect(convertFilterChangedToUpdateFiltersPayload({})).toEqual({ filters: [] });
7
+ });
8
+ test('returns an empty filters array for null/undefined input', () => {
9
+ expect(convertFilterChangedToUpdateFiltersPayload(null)).toEqual({ filters: [] });
10
+ expect(convertFilterChangedToUpdateFiltersPayload(undefined)).toEqual({ filters: [] });
11
+ });
12
+ test('converts runtime filters as-is', () => {
13
+ const payload = {
14
+ runtimeFilters: [
15
+ { columnName: 'state', operator: RuntimeFilterOp.EQ, values: ['california'] },
16
+ ],
17
+ };
18
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
19
+ filters: [
20
+ { columnName: 'state', operator: RuntimeFilterOp.EQ, values: ['california'] },
21
+ ],
22
+ });
23
+ });
24
+ test('converts a simple attribute filter (filterContent)', () => {
25
+ const payload = {
26
+ liveboardFilters: [
27
+ {
28
+ columnInfo: { name: 'item type' },
29
+ filters: [
30
+ {
31
+ filterContent: [
32
+ {
33
+ filterType: 'IN',
34
+ value: [{ key: 'bags' }, { key: 'shirts' }],
35
+ },
36
+ ],
37
+ },
38
+ ],
39
+ },
40
+ ],
41
+ };
42
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
43
+ filters: [
44
+ { columnName: 'item type', operator: 'IN', values: ['bags', 'shirts'] },
45
+ ],
46
+ });
47
+ });
48
+ test('includes negate when set on a filterContent filter', () => {
49
+ const payload = {
50
+ liveboardFilters: [
51
+ {
52
+ columnInfo: { name: 'region' },
53
+ filters: [
54
+ {
55
+ filterContent: [
56
+ {
57
+ filterType: 'EQ',
58
+ negate: true,
59
+ value: [{ key: 'west' }],
60
+ },
61
+ ],
62
+ },
63
+ ],
64
+ },
65
+ ],
66
+ };
67
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
68
+ filters: [
69
+ { columnName: 'region', operator: 'EQ', values: ['west'], negate: true },
70
+ ],
71
+ });
72
+ });
73
+ test('skips a filter group with no columnInfo.name', () => {
74
+ const payload = {
75
+ liveboardFilters: [
76
+ {
77
+ filters: [
78
+ { filterContent: [{ filterType: 'EQ', value: [{ key: 'x' }] }] },
79
+ ],
80
+ },
81
+ ],
82
+ };
83
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
84
+ });
85
+ test('skips a filter with neither filterContent nor dateFilterContent', () => {
86
+ const payload = {
87
+ liveboardFilters: [
88
+ {
89
+ columnInfo: { name: 'region' },
90
+ filters: [{}],
91
+ },
92
+ ],
93
+ };
94
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
95
+ });
96
+ test('converts an EXACT_DATE filter using epoch', () => {
97
+ const payload = {
98
+ liveboardFilters: [
99
+ {
100
+ columnInfo: { name: 'date' },
101
+ filters: [
102
+ {
103
+ dateFilterContent: [
104
+ {
105
+ dateFilter: { type: 'EXACT_DATE', op: 'EQ', epoch: '1690847400' },
106
+ },
107
+ ],
108
+ },
109
+ ],
110
+ },
111
+ ],
112
+ };
113
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
114
+ filters: [
115
+ {
116
+ columnName: 'date', operator: 'EQ', values: [1690847400], type: 'EXACT_DATE',
117
+ },
118
+ ],
119
+ });
120
+ });
121
+ test('converts an EXACT_DATE_RANGE filter using dateRange epochs', () => {
122
+ const payload = {
123
+ liveboardFilters: [
124
+ {
125
+ columnInfo: { name: 'date' },
126
+ filters: [
127
+ {
128
+ dateFilterContent: [
129
+ {
130
+ dateFilter: {
131
+ type: 'EXACT_DATE_RANGE',
132
+ op: 'BW_INC',
133
+ dateRange: { lowEpoch: '100', highEpoch: '200' },
134
+ },
135
+ },
136
+ ],
137
+ },
138
+ ],
139
+ },
140
+ ],
141
+ };
142
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
143
+ filters: [
144
+ {
145
+ columnName: 'date', operator: 'BW_INC', values: [100, 200], type: 'EXACT_DATE_RANGE',
146
+ },
147
+ ],
148
+ });
149
+ });
150
+ test('converts a MONTH_YEAR filter', () => {
151
+ const payload = {
152
+ liveboardFilters: [
153
+ {
154
+ columnInfo: { name: 'date' },
155
+ filters: [
156
+ {
157
+ dateFilterContent: [
158
+ {
159
+ dateFilter: {
160
+ type: 'MONTH_YEAR', op: 'EQ', monthName: 'JULY', yearName: '2023',
161
+ },
162
+ },
163
+ ],
164
+ },
165
+ ],
166
+ },
167
+ ],
168
+ };
169
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
170
+ filters: [
171
+ {
172
+ columnName: 'date', operator: 'EQ', values: ['JULY', '2023'], type: 'MONTH_YEAR',
173
+ },
174
+ ],
175
+ });
176
+ });
177
+ test('converts a QUARTER_YEAR filter', () => {
178
+ const payload = {
179
+ liveboardFilters: [
180
+ {
181
+ columnInfo: { name: 'date' },
182
+ filters: [
183
+ {
184
+ dateFilterContent: [
185
+ {
186
+ dateFilter: {
187
+ type: 'QUARTER_YEAR', op: 'EQ', quarterName: 'Q1', yearName: '2023',
188
+ },
189
+ },
190
+ ],
191
+ },
192
+ ],
193
+ },
194
+ ],
195
+ };
196
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
197
+ filters: [
198
+ {
199
+ columnName: 'date', operator: 'EQ', values: ['Q1', '2023'], type: 'QUARTER_YEAR',
200
+ },
201
+ ],
202
+ });
203
+ });
204
+ test('converts a YEAR_ONLY filter', () => {
205
+ const payload = {
206
+ liveboardFilters: [
207
+ {
208
+ columnInfo: { name: 'date' },
209
+ filters: [
210
+ {
211
+ dateFilterContent: [
212
+ { dateFilter: { type: 'YEAR_ONLY', op: 'EQ', yearName: '2023' } },
213
+ ],
214
+ },
215
+ ],
216
+ },
217
+ ],
218
+ };
219
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
220
+ filters: [
221
+ { columnName: 'date', operator: 'EQ', values: ['2023'], type: 'YEAR_ONLY' },
222
+ ],
223
+ });
224
+ });
225
+ test('converts a LAST_N_PERIOD filter with datePeriod and includeCurrentPeriod', () => {
226
+ const payload = {
227
+ liveboardFilters: [
228
+ {
229
+ columnInfo: { name: 'date' },
230
+ filters: [
231
+ {
232
+ dateFilterContent: [
233
+ {
234
+ negate: true,
235
+ dateFilter: {
236
+ type: 'LAST_N_PERIOD',
237
+ op: 'EQ',
238
+ number: 3,
239
+ datePeriod: 'MONTH',
240
+ includeCurrentPeriod: true,
241
+ },
242
+ },
243
+ ],
244
+ },
245
+ ],
246
+ },
247
+ ],
248
+ };
249
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
250
+ filters: [
251
+ {
252
+ columnName: 'date',
253
+ operator: 'EQ',
254
+ values: [3],
255
+ type: 'LAST_N_PERIOD',
256
+ datePeriod: 'MONTH',
257
+ includeCurrentPeriod: true,
258
+ negate: true,
259
+ },
260
+ ],
261
+ });
262
+ });
263
+ test('converts a period-only date filter (e.g. TODAY) with empty values', () => {
264
+ const payload = {
265
+ liveboardFilters: [
266
+ {
267
+ columnInfo: { name: 'date' },
268
+ filters: [
269
+ {
270
+ dateFilterContent: [
271
+ { dateFilter: { type: 'TODAY', op: 'EQ' } },
272
+ ],
273
+ },
274
+ ],
275
+ },
276
+ ],
277
+ };
278
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
279
+ filters: [
280
+ { columnName: 'date', operator: 'EQ', values: [], type: 'TODAY' },
281
+ ],
282
+ });
283
+ });
284
+ test('skips a dateFilterContent entry with no type', () => {
285
+ const payload = {
286
+ liveboardFilters: [
287
+ {
288
+ columnInfo: { name: 'date' },
289
+ filters: [
290
+ { dateFilterContent: [{ dateFilter: {} }] },
291
+ ],
292
+ },
293
+ ],
294
+ };
295
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
296
+ });
297
+ test('defaults operator to EQ when dateFilter.op is missing', () => {
298
+ const payload = {
299
+ liveboardFilters: [
300
+ {
301
+ columnInfo: { name: 'date' },
302
+ filters: [
303
+ { dateFilterContent: [{ dateFilter: { type: 'TODAY' } }] },
304
+ ],
305
+ },
306
+ ],
307
+ };
308
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
309
+ filters: [
310
+ { columnName: 'date', operator: RuntimeFilterOp.EQ, values: [], type: 'TODAY' },
311
+ ],
312
+ });
313
+ });
314
+ test('converts every filterContent entry on a filter, not just the first', () => {
315
+ const payload = {
316
+ liveboardFilters: [
317
+ {
318
+ columnInfo: { name: 'quantity' },
319
+ filters: [
320
+ {
321
+ filterContent: [
322
+ { filterType: 'GE', value: [{ key: 5 }] },
323
+ { filterType: 'LE', value: [{ key: 10 }] },
324
+ ],
325
+ },
326
+ ],
327
+ },
328
+ ],
329
+ };
330
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
331
+ filters: [
332
+ { columnName: 'quantity', operator: 'GE', values: [5] },
333
+ { columnName: 'quantity', operator: 'LE', values: [10] },
334
+ ],
335
+ });
336
+ });
337
+ test('converts every Filter entry in a filter group, not just the first', () => {
338
+ const payload = {
339
+ liveboardFilters: [
340
+ {
341
+ columnInfo: { name: 'region' },
342
+ filters: [
343
+ { filterContent: [{ filterType: 'EQ', value: [{ key: 'west' }] }] },
344
+ { filterContent: [{ filterType: 'EQ', value: [{ key: 'east' }] }] },
345
+ ],
346
+ },
347
+ ],
348
+ };
349
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
350
+ filters: [
351
+ { columnName: 'region', operator: 'EQ', values: ['west'] },
352
+ { columnName: 'region', operator: 'EQ', values: ['east'] },
353
+ ],
354
+ });
355
+ });
356
+ test('keeps falsy-but-defined filter values such as 0 and false', () => {
357
+ const payload = {
358
+ liveboardFilters: [
359
+ {
360
+ columnInfo: { name: 'flag' },
361
+ filters: [
362
+ {
363
+ filterContent: [
364
+ { filterType: 'IN', value: [{ key: 0 }, { key: false }] },
365
+ ],
366
+ },
367
+ ],
368
+ },
369
+ ],
370
+ };
371
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
372
+ filters: [
373
+ { columnName: 'flag', operator: 'IN', values: [0, false] },
374
+ ],
375
+ });
376
+ });
377
+ test('skips an EXACT_DATE filter missing its epoch instead of emitting empty values', () => {
378
+ const payload = {
379
+ liveboardFilters: [
380
+ {
381
+ columnInfo: { name: 'date' },
382
+ filters: [
383
+ { dateFilterContent: [{ dateFilter: { type: 'EXACT_DATE', op: 'EQ' } }] },
384
+ ],
385
+ },
386
+ ],
387
+ };
388
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
389
+ });
390
+ test('skips a MONTH_YEAR filter missing yearName instead of emitting empty values', () => {
391
+ const payload = {
392
+ liveboardFilters: [
393
+ {
394
+ columnInfo: { name: 'date' },
395
+ filters: [
396
+ {
397
+ dateFilterContent: [
398
+ { dateFilter: { type: 'MONTH_YEAR', op: 'EQ', monthName: 'JULY' } },
399
+ ],
400
+ },
401
+ ],
402
+ },
403
+ ],
404
+ };
405
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
406
+ });
407
+ test('skips an unrecognized date filter type rather than guessing', () => {
408
+ const payload = {
409
+ liveboardFilters: [
410
+ {
411
+ columnInfo: { name: 'date' },
412
+ filters: [
413
+ { dateFilterContent: [{ dateFilter: { type: 'SOME_FUTURE_TYPE', op: 'EQ' } }] },
414
+ ],
415
+ },
416
+ ],
417
+ };
418
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
419
+ });
420
+ test('output satisfies isValidUpdateFiltersPayload', () => {
421
+ const payload = {
422
+ liveboardFilters: [
423
+ {
424
+ columnInfo: { name: 'item type' },
425
+ filters: [
426
+ { filterContent: [{ filterType: 'IN', value: [{ key: 'bags' }] }] },
427
+ ],
428
+ },
429
+ ],
430
+ runtimeFilters: [
431
+ { columnName: 'region', operator: RuntimeFilterOp.EQ, values: ['west'] },
432
+ ],
433
+ };
434
+ const converted = convertFilterChangedToUpdateFiltersPayload(payload);
435
+ expect(isValidUpdateFiltersPayload(converted)).toBe(true);
436
+ });
437
+ test('combines multiple liveboard filters and runtime filters', () => {
438
+ const payload = {
439
+ liveboardFilters: [
440
+ {
441
+ columnInfo: { name: 'item type' },
442
+ filters: [
443
+ { filterContent: [{ filterType: 'IN', value: [{ key: 'bags' }] }] },
444
+ ],
445
+ },
446
+ ],
447
+ runtimeFilters: [
448
+ { columnName: 'region', operator: RuntimeFilterOp.EQ, values: ['west'] },
449
+ ],
450
+ };
451
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
452
+ filters: [
453
+ { columnName: 'item type', operator: 'IN', values: ['bags'] },
454
+ { columnName: 'region', operator: RuntimeFilterOp.EQ, values: ['west'] },
455
+ ],
456
+ });
457
+ });
458
+ // The payload arrives as JSON from the embedded app, so an absent field can
459
+ // be `null` rather than omitted. `Number(null)` is 0, so a naive coercion
460
+ // would turn a missing epoch into 1970 and a missing period count into 0.
461
+ describe('null and non-numeric values in the payload', () => {
462
+ const dateFilterPayload = (dateFilter) => ({
463
+ liveboardFilters: [
464
+ {
465
+ columnInfo: { name: 'date' },
466
+ filters: [{ dateFilterContent: [{ dateFilter: dateFilter }] }],
467
+ },
468
+ ],
469
+ });
470
+ test.each([null, '', 'not-a-date'])('skips an EXACT_DATE filter whose epoch is %p instead of emitting epoch 0', (epoch) => {
471
+ const payload = dateFilterPayload({ type: 'EXACT_DATE', op: 'EQ', epoch });
472
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
473
+ });
474
+ test('skips an EXACT_DATE_RANGE filter when either bound is null', () => {
475
+ const missingHigh = dateFilterPayload({
476
+ type: 'EXACT_DATE_RANGE', op: 'BW', dateRange: { lowEpoch: 1000, highEpoch: null },
477
+ });
478
+ const missingLow = dateFilterPayload({
479
+ type: 'EXACT_DATE_RANGE', op: 'BW', dateRange: { lowEpoch: null, highEpoch: 2000 },
480
+ });
481
+ expect(convertFilterChangedToUpdateFiltersPayload(missingHigh)).toEqual({ filters: [] });
482
+ expect(convertFilterChangedToUpdateFiltersPayload(missingLow)).toEqual({ filters: [] });
483
+ });
484
+ test.each(['LAST_N_PERIOD', 'NEXT_N_PERIOD'])('skips a %s filter whose number is null instead of emitting a 0-length period', (type) => {
485
+ const payload = dateFilterPayload({ type, op: 'EQ', number: null, datePeriod: 'MONTH' });
486
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
487
+ });
488
+ test('accepts an epoch of 0 as a real value', () => {
489
+ const payload = dateFilterPayload({ type: 'EXACT_DATE', op: 'EQ', epoch: 0 });
490
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
491
+ filters: [{
492
+ columnName: 'date', operator: 'EQ', values: [0], type: 'EXACT_DATE',
493
+ }],
494
+ });
495
+ });
496
+ test('accepts a numeric epoch sent as a string', () => {
497
+ const payload = dateFilterPayload({ type: 'EXACT_DATE', op: 'EQ', epoch: '1700000000' });
498
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
499
+ filters: [{
500
+ columnName: 'date', operator: 'EQ', values: [1700000000], type: 'EXACT_DATE',
501
+ }],
502
+ });
503
+ });
504
+ test('omits includeCurrentPeriod when it is null', () => {
505
+ const payload = dateFilterPayload({
506
+ type: 'LAST_N_PERIOD', op: 'EQ', number: 3, datePeriod: 'MONTH', includeCurrentPeriod: null,
507
+ });
508
+ const [filter] = convertFilterChangedToUpdateFiltersPayload(payload).filters;
509
+ expect(filter).not.toHaveProperty('includeCurrentPeriod');
510
+ });
511
+ test('keeps includeCurrentPeriod when it is explicitly false', () => {
512
+ const payload = dateFilterPayload({
513
+ type: 'LAST_N_PERIOD', op: 'EQ', number: 3, datePeriod: 'MONTH', includeCurrentPeriod: false,
514
+ });
515
+ const [filter] = convertFilterChangedToUpdateFiltersPayload(payload).filters;
516
+ expect(filter.includeCurrentPeriod).toBe(false);
517
+ });
518
+ test('drops null keys from an attribute filter but keeps the rest', () => {
519
+ const payload = {
520
+ liveboardFilters: [
521
+ {
522
+ columnInfo: { name: 'item type' },
523
+ filters: [
524
+ {
525
+ filterContent: [
526
+ {
527
+ filterType: 'IN',
528
+ value: [{ key: 'bags' }, { key: null }, { key: 'shirts' }],
529
+ },
530
+ ],
531
+ },
532
+ ],
533
+ },
534
+ ],
535
+ };
536
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
537
+ filters: [{ columnName: 'item type', operator: 'IN', values: ['bags', 'shirts'] }],
538
+ });
539
+ });
540
+ test('keeps a falsy-but-real key such as 0 or false', () => {
541
+ const payload = {
542
+ liveboardFilters: [
543
+ {
544
+ columnInfo: { name: 'quantity' },
545
+ filters: [
546
+ { filterContent: [{ filterType: 'IN', value: [{ key: 0 }, { key: false }] }] },
547
+ ],
548
+ },
549
+ ],
550
+ };
551
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
552
+ filters: [{ columnName: 'quantity', operator: 'IN', values: [0, false] }],
553
+ });
554
+ });
555
+ });
556
+ // A runtime filter needs no reshaping, but it still arrives as JSON. One
557
+ // malformed entry fails isValidUpdateFiltersPayload for the WHOLE filters
558
+ // array, which would take every other converted filter down with it.
559
+ describe('malformed runtime filters', () => {
560
+ const malformed = [
561
+ { columnName: null, operator: RuntimeFilterOp.EQ, values: ['west'] },
562
+ { columnName: '', operator: RuntimeFilterOp.EQ, values: ['west'] },
563
+ { operator: RuntimeFilterOp.EQ, values: ['west'] },
564
+ { columnName: 'region', operator: null, values: ['west'] },
565
+ { columnName: 'region', values: ['west'] },
566
+ { columnName: 'region', operator: RuntimeFilterOp.EQ, values: null },
567
+ { columnName: 'region', operator: RuntimeFilterOp.EQ },
568
+ ];
569
+ test.each(malformed)('skips the malformed runtime filter %p', (runtimeFilter) => {
570
+ const payload = { runtimeFilters: [runtimeFilter] };
571
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({ filters: [] });
572
+ });
573
+ test('a bad runtime filter does not discard the good filters alongside it', () => {
574
+ const payload = {
575
+ liveboardFilters: [
576
+ {
577
+ columnInfo: { name: 'item type' },
578
+ filters: [{ filterContent: [{ filterType: 'IN', value: [{ key: 'bags' }] }] }],
579
+ },
580
+ ],
581
+ runtimeFilters: [
582
+ { columnName: null, operator: RuntimeFilterOp.EQ, values: ['west'] },
583
+ { columnName: 'region', operator: RuntimeFilterOp.EQ, values: ['west'] },
584
+ ],
585
+ };
586
+ const converted = convertFilterChangedToUpdateFiltersPayload(payload);
587
+ expect(converted).toEqual({
588
+ filters: [
589
+ { columnName: 'item type', operator: 'IN', values: ['bags'] },
590
+ { columnName: 'region', operator: RuntimeFilterOp.EQ, values: ['west'] },
591
+ ],
592
+ });
593
+ // The whole point: the surviving payload is still triggerable.
594
+ expect(isValidUpdateFiltersPayload(converted)).toBe(true);
595
+ });
596
+ test('keeps a runtime filter with an empty values array', () => {
597
+ const payload = {
598
+ runtimeFilters: [{ columnName: 'region', operator: RuntimeFilterOp.EQ, values: [] }],
599
+ };
600
+ expect(convertFilterChangedToUpdateFiltersPayload(payload)).toEqual({
601
+ filters: [{ columnName: 'region', operator: RuntimeFilterOp.EQ, values: [] }],
602
+ });
603
+ });
604
+ });
605
+ // liveboardFilters entries carry an optional `applicability`
606
+ // ({level, targetId}) from SDK 1.53.0 / 26.10.0.cl, and UpdateFilters
607
+ // accepts it per filter. Dropping it would replay a tab-scoped filter
608
+ // across the whole Liveboard.
609
+ describe('applicability (filter scope)', () => {
610
+ const TAB_ID = 'e0836cad-4fdf-42d4-bd97-567a6b2a6058';
611
+ const groupWith = (applicability) => ({
612
+ liveboardFilters: [
613
+ {
614
+ columnInfo: { name: 'item type' },
615
+ applicability,
616
+ filters: [{ filterContent: [{ filterType: 'IN', value: [{ key: 'bags' }] }] }],
617
+ },
618
+ ],
619
+ });
620
+ test('carries TAB scope through to the converted filter', () => {
621
+ const converted = convertFilterChangedToUpdateFiltersPayload(groupWith({ level: 'TAB', targetId: TAB_ID }));
622
+ expect(converted).toEqual({
623
+ filters: [{
624
+ columnName: 'item type',
625
+ operator: 'IN',
626
+ values: ['bags'],
627
+ applicability: { level: 'TAB', targetId: TAB_ID },
628
+ }],
629
+ });
630
+ expect(isValidUpdateFiltersPayload(converted)).toBe(true);
631
+ });
632
+ test('carries GROUP scope through to the converted filter', () => {
633
+ const converted = convertFilterChangedToUpdateFiltersPayload(groupWith({ level: 'GROUP', targetId: TAB_ID }));
634
+ expect(converted.filters[0].applicability).toEqual({ level: 'GROUP', targetId: TAB_ID });
635
+ expect(isValidUpdateFiltersPayload(converted)).toBe(true);
636
+ });
637
+ test('carries LIVEBOARD scope, which needs no targetId', () => {
638
+ const converted = convertFilterChangedToUpdateFiltersPayload(groupWith({ level: 'LIVEBOARD' }));
639
+ expect(converted.filters[0].applicability).toEqual({ level: 'LIVEBOARD' });
640
+ expect(isValidUpdateFiltersPayload(converted)).toBe(true);
641
+ });
642
+ test('omits applicability entirely when the payload has none', () => {
643
+ const converted = convertFilterChangedToUpdateFiltersPayload(groupWith(undefined));
644
+ expect(converted.filters[0]).not.toHaveProperty('applicability');
645
+ expect(isValidUpdateFiltersPayload(converted)).toBe(true);
646
+ });
647
+ test('applies the group scope to every filter the group produces', () => {
648
+ const payload = {
649
+ liveboardFilters: [
650
+ {
651
+ columnInfo: { name: 'quantity' },
652
+ applicability: { level: 'TAB', targetId: TAB_ID },
653
+ filters: [
654
+ {
655
+ filterContent: [
656
+ { filterType: 'GE', value: [{ key: 5 }] },
657
+ { filterType: 'LE', value: [{ key: 10 }] },
658
+ ],
659
+ },
660
+ ],
661
+ },
662
+ ],
663
+ };
664
+ const converted = convertFilterChangedToUpdateFiltersPayload(payload);
665
+ expect(converted.filters).toHaveLength(2);
666
+ converted.filters.forEach((filter) => {
667
+ expect(filter.applicability).toEqual({ level: 'TAB', targetId: TAB_ID });
668
+ });
669
+ });
670
+ test.each([
671
+ [{ level: 'TAB' }, 'TAB with no targetId'],
672
+ [{ level: 'GROUP', targetId: ' ' }, 'GROUP with a blank targetId'],
673
+ [{ level: 'SOMETHING_ELSE', targetId: TAB_ID }, 'an unknown level'],
674
+ [{ targetId: TAB_ID }, 'no level at all'],
675
+ ])('skips a filter scoped with %p (%s) rather than widening it', (applicability, _label) => {
676
+ expect(convertFilterChangedToUpdateFiltersPayload(groupWith(applicability)))
677
+ .toEqual({ filters: [] });
678
+ });
679
+ test('a malformed scope on one column does not invalidate the others', () => {
680
+ const payload = {
681
+ liveboardFilters: [
682
+ {
683
+ columnInfo: { name: 'item type' },
684
+ applicability: { level: 'TAB' },
685
+ filters: [{ filterContent: [{ filterType: 'IN', value: [{ key: 'bags' }] }] }],
686
+ },
687
+ {
688
+ columnInfo: { name: 'region' },
689
+ applicability: { level: 'TAB', targetId: TAB_ID },
690
+ filters: [{ filterContent: [{ filterType: 'IN', value: [{ key: 'west' }] }] }],
691
+ },
692
+ ],
693
+ };
694
+ const converted = convertFilterChangedToUpdateFiltersPayload(payload);
695
+ expect(converted).toEqual({
696
+ filters: [{
697
+ columnName: 'region',
698
+ operator: 'IN',
699
+ values: ['west'],
700
+ applicability: { level: 'TAB', targetId: TAB_ID },
701
+ }],
702
+ });
703
+ expect(isValidUpdateFiltersPayload(converted)).toBe(true);
704
+ });
705
+ });
706
+ });
707
+ //# sourceMappingURL=filterConverter.spec.js.map