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