@thoughtspot/visual-embed-sdk 1.52.0 → 1.52.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (279) hide show
  1. package/cjs/package.json +9 -1
  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 +378 -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 +17 -140
  23. package/cjs/src/embed/app.d.ts.map +1 -1
  24. package/cjs/src/embed/app.js +20 -120
  25. package/cjs/src/embed/app.js.map +1 -1
  26. package/cjs/src/embed/app.spec.js +70 -26
  27. package/cjs/src/embed/app.spec.js.map +1 -1
  28. package/cjs/src/embed/events.spec.js +12 -2
  29. package/cjs/src/embed/events.spec.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  31. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/host-event-client.js +23 -18
  33. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +36 -36
  35. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  36. package/cjs/src/embed/hostEventClient/utils.d.ts +1 -1
  37. package/cjs/src/embed/hostEventClient/utils.d.ts.map +1 -1
  38. package/cjs/src/embed/hostEventClient/utils.js +3 -3
  39. package/cjs/src/embed/hostEventClient/utils.js.map +1 -1
  40. package/cjs/src/embed/liveboard.d.ts +9 -161
  41. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  42. package/cjs/src/embed/liveboard.js +66 -134
  43. package/cjs/src/embed/liveboard.js.map +1 -1
  44. package/cjs/src/embed/liveboard.spec.js +211 -28
  45. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  46. package/cjs/src/embed/search.d.ts +14 -0
  47. package/cjs/src/embed/search.d.ts.map +1 -1
  48. package/cjs/src/embed/search.js +4 -1
  49. package/cjs/src/embed/search.js.map +1 -1
  50. package/cjs/src/embed/search.spec.js +65 -0
  51. package/cjs/src/embed/search.spec.js.map +1 -1
  52. package/cjs/src/embed/ts-embed.d.ts +17 -22
  53. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  54. package/cjs/src/embed/ts-embed.js +82 -56
  55. package/cjs/src/embed/ts-embed.js.map +1 -1
  56. package/cjs/src/embed/ts-embed.spec.js +325 -17
  57. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  58. package/cjs/src/full-height.d.ts +137 -0
  59. package/cjs/src/full-height.d.ts.map +1 -0
  60. package/cjs/src/full-height.js +272 -0
  61. package/cjs/src/full-height.js.map +1 -0
  62. package/cjs/src/full-height.spec.d.ts +2 -0
  63. package/cjs/src/full-height.spec.d.ts.map +1 -0
  64. package/cjs/src/full-height.spec.js +835 -0
  65. package/cjs/src/full-height.spec.js.map +1 -0
  66. package/cjs/src/index.d.ts +4 -3
  67. package/cjs/src/index.d.ts.map +1 -1
  68. package/cjs/src/index.js +3 -3
  69. package/cjs/src/index.js.map +1 -1
  70. package/cjs/src/react/all-types-export.d.ts +1 -1
  71. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  72. package/cjs/src/react/all-types-export.js.map +1 -1
  73. package/cjs/src/react/all-types-export.parity.spec.js +55 -3
  74. package/cjs/src/react/all-types-export.parity.spec.js.map +1 -1
  75. package/cjs/src/types.d.ts +540 -3
  76. package/cjs/src/types.d.ts.map +1 -1
  77. package/cjs/src/types.js +326 -1
  78. package/cjs/src/types.js.map +1 -1
  79. package/cjs/src/utils/processTrigger.d.ts +3 -1
  80. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  81. package/cjs/src/utils/processTrigger.js +19 -51
  82. package/cjs/src/utils/processTrigger.js.map +1 -1
  83. package/cjs/src/utils/transport/iframe-transport.d.ts +55 -0
  84. package/cjs/src/utils/transport/iframe-transport.d.ts.map +1 -0
  85. package/cjs/src/utils/transport/iframe-transport.js +108 -0
  86. package/cjs/src/utils/transport/iframe-transport.js.map +1 -0
  87. package/cjs/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  88. package/cjs/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  89. package/cjs/src/utils/transport/iframe-transport.spec.js +140 -0
  90. package/cjs/src/utils/transport/iframe-transport.spec.js.map +1 -0
  91. package/cjs/src/utils.d.ts +18 -0
  92. package/cjs/src/utils.d.ts.map +1 -1
  93. package/cjs/src/utils.js +39 -1
  94. package/cjs/src/utils.js.map +1 -1
  95. package/cjs/src/utils.spec.js +62 -0
  96. package/cjs/src/utils.spec.js.map +1 -1
  97. package/dist/{index-BMppCU63.js → index-C1pmYb5H.js} +1 -1
  98. package/dist/src/contracts/contracts.spec.d.ts +2 -0
  99. package/dist/src/contracts/contracts.spec.d.ts.map +1 -0
  100. package/dist/src/contracts/embed-event-payloads.d.ts +73 -0
  101. package/dist/src/contracts/embed-event-payloads.d.ts.map +1 -0
  102. package/dist/src/contracts/host-event-contracts.d.ts +378 -0
  103. package/dist/src/contracts/host-event-contracts.d.ts.map +1 -0
  104. package/dist/src/contracts/index.d.ts +22 -0
  105. package/dist/src/contracts/index.d.ts.map +1 -0
  106. package/dist/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  107. package/dist/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  108. package/dist/src/embed/app.d.ts +17 -140
  109. package/dist/src/embed/app.d.ts.map +1 -1
  110. package/dist/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  111. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  112. package/dist/src/embed/hostEventClient/utils.d.ts +1 -1
  113. package/dist/src/embed/hostEventClient/utils.d.ts.map +1 -1
  114. package/dist/src/embed/liveboard.d.ts +9 -161
  115. package/dist/src/embed/liveboard.d.ts.map +1 -1
  116. package/dist/src/embed/search.d.ts +14 -0
  117. package/dist/src/embed/search.d.ts.map +1 -1
  118. package/dist/src/embed/ts-embed.d.ts +17 -22
  119. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  120. package/dist/src/full-height.d.ts +137 -0
  121. package/dist/src/full-height.d.ts.map +1 -0
  122. package/dist/src/full-height.spec.d.ts +2 -0
  123. package/dist/src/full-height.spec.d.ts.map +1 -0
  124. package/dist/src/index.d.ts +4 -3
  125. package/dist/src/index.d.ts.map +1 -1
  126. package/dist/src/react/all-types-export.d.ts +1 -1
  127. package/dist/src/react/all-types-export.d.ts.map +1 -1
  128. package/dist/src/types.d.ts +540 -3
  129. package/dist/src/types.d.ts.map +1 -1
  130. package/dist/src/utils/processTrigger.d.ts +3 -1
  131. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  132. package/dist/src/utils/transport/iframe-transport.d.ts +55 -0
  133. package/dist/src/utils/transport/iframe-transport.d.ts.map +1 -0
  134. package/dist/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  135. package/dist/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  136. package/dist/src/utils.d.ts +18 -0
  137. package/dist/src/utils.d.ts.map +1 -1
  138. package/dist/tsembed-react.es.js +925 -363
  139. package/dist/tsembed-react.js +924 -362
  140. package/dist/tsembed.es.js +925 -363
  141. package/dist/tsembed.js +924 -362
  142. package/dist/visual-embed-sdk-react-full.d.ts +1357 -656
  143. package/dist/visual-embed-sdk-react.d.ts +1257 -606
  144. package/dist/visual-embed-sdk.d.ts +1320 -642
  145. package/lib/package.json +9 -1
  146. package/lib/src/contracts/contracts.spec.d.ts +2 -0
  147. package/lib/src/contracts/contracts.spec.d.ts.map +1 -0
  148. package/lib/src/contracts/contracts.spec.js +342 -0
  149. package/lib/src/contracts/contracts.spec.js.map +1 -0
  150. package/lib/src/contracts/embed-event-payloads.d.ts +73 -0
  151. package/lib/src/contracts/embed-event-payloads.d.ts.map +1 -0
  152. package/lib/src/contracts/embed-event-payloads.js +2 -0
  153. package/lib/src/contracts/embed-event-payloads.js.map +1 -0
  154. package/lib/src/contracts/host-event-contracts.d.ts +378 -0
  155. package/lib/src/contracts/host-event-contracts.d.ts.map +1 -0
  156. package/lib/src/contracts/host-event-contracts.js +2 -0
  157. package/lib/src/contracts/host-event-contracts.js.map +1 -0
  158. package/lib/src/contracts/index.d.ts +22 -0
  159. package/lib/src/contracts/index.d.ts.map +1 -0
  160. package/lib/src/contracts/index.js +22 -0
  161. package/lib/src/contracts/index.js.map +1 -0
  162. package/lib/src/contracts/ui-passthrough-contracts.d.ts +277 -0
  163. package/lib/src/contracts/ui-passthrough-contracts.d.ts.map +1 -0
  164. package/lib/src/{embed/hostEventClient/contracts.js → contracts/ui-passthrough-contracts.js} +6 -2
  165. package/lib/src/contracts/ui-passthrough-contracts.js.map +1 -0
  166. package/lib/src/embed/app.d.ts +17 -140
  167. package/lib/src/embed/app.d.ts.map +1 -1
  168. package/lib/src/embed/app.js +22 -122
  169. package/lib/src/embed/app.js.map +1 -1
  170. package/lib/src/embed/app.spec.js +70 -26
  171. package/lib/src/embed/app.spec.js.map +1 -1
  172. package/lib/src/embed/events.spec.js +12 -2
  173. package/lib/src/embed/events.spec.js.map +1 -1
  174. package/lib/src/embed/hostEventClient/host-event-client.d.ts +3 -2
  175. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  176. package/lib/src/embed/hostEventClient/host-event-client.js +6 -1
  177. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  178. package/lib/src/embed/hostEventClient/host-event-client.spec.js +1 -1
  179. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  180. package/lib/src/embed/hostEventClient/utils.d.ts +1 -1
  181. package/lib/src/embed/hostEventClient/utils.d.ts.map +1 -1
  182. package/lib/src/embed/hostEventClient/utils.js +1 -1
  183. package/lib/src/embed/hostEventClient/utils.js.map +1 -1
  184. package/lib/src/embed/liveboard.d.ts +9 -161
  185. package/lib/src/embed/liveboard.d.ts.map +1 -1
  186. package/lib/src/embed/liveboard.js +67 -135
  187. package/lib/src/embed/liveboard.js.map +1 -1
  188. package/lib/src/embed/liveboard.spec.js +211 -28
  189. package/lib/src/embed/liveboard.spec.js.map +1 -1
  190. package/lib/src/embed/search.d.ts +14 -0
  191. package/lib/src/embed/search.d.ts.map +1 -1
  192. package/lib/src/embed/search.js +4 -1
  193. package/lib/src/embed/search.js.map +1 -1
  194. package/lib/src/embed/search.spec.js +65 -0
  195. package/lib/src/embed/search.spec.js.map +1 -1
  196. package/lib/src/embed/ts-embed.d.ts +17 -22
  197. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  198. package/lib/src/embed/ts-embed.js +82 -56
  199. package/lib/src/embed/ts-embed.js.map +1 -1
  200. package/lib/src/embed/ts-embed.spec.js +322 -14
  201. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  202. package/lib/src/full-height.d.ts +137 -0
  203. package/lib/src/full-height.d.ts.map +1 -0
  204. package/lib/src/full-height.js +268 -0
  205. package/lib/src/full-height.js.map +1 -0
  206. package/lib/src/full-height.spec.d.ts +2 -0
  207. package/lib/src/full-height.spec.d.ts.map +1 -0
  208. package/lib/src/full-height.spec.js +833 -0
  209. package/lib/src/full-height.spec.js.map +1 -0
  210. package/lib/src/index.d.ts +4 -3
  211. package/lib/src/index.d.ts.map +1 -1
  212. package/lib/src/index.js +1 -1
  213. package/lib/src/index.js.map +1 -1
  214. package/lib/src/react/all-types-export.d.ts +1 -1
  215. package/lib/src/react/all-types-export.d.ts.map +1 -1
  216. package/lib/src/react/all-types-export.js.map +1 -1
  217. package/lib/src/react/all-types-export.parity.spec.js +55 -3
  218. package/lib/src/react/all-types-export.parity.spec.js.map +1 -1
  219. package/lib/src/types.d.ts +540 -3
  220. package/lib/src/types.d.ts.map +1 -1
  221. package/lib/src/types.js +326 -1
  222. package/lib/src/types.js.map +1 -1
  223. package/lib/src/utils/processTrigger.d.ts +3 -1
  224. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  225. package/lib/src/utils/processTrigger.js +19 -51
  226. package/lib/src/utils/processTrigger.js.map +1 -1
  227. package/lib/src/utils/transport/iframe-transport.d.ts +55 -0
  228. package/lib/src/utils/transport/iframe-transport.d.ts.map +1 -0
  229. package/lib/src/utils/transport/iframe-transport.js +101 -0
  230. package/lib/src/utils/transport/iframe-transport.js.map +1 -0
  231. package/lib/src/utils/transport/iframe-transport.spec.d.ts +2 -0
  232. package/lib/src/utils/transport/iframe-transport.spec.d.ts.map +1 -0
  233. package/lib/src/utils/transport/iframe-transport.spec.js +138 -0
  234. package/lib/src/utils/transport/iframe-transport.spec.js.map +1 -0
  235. package/lib/src/utils.d.ts +18 -0
  236. package/lib/src/utils.d.ts.map +1 -1
  237. package/lib/src/utils.js +37 -0
  238. package/lib/src/utils.js.map +1 -1
  239. package/lib/src/utils.spec.js +63 -1
  240. package/lib/src/utils.spec.js.map +1 -1
  241. package/lib/src/visual-embed-sdk.d.ts +1320 -642
  242. package/package.json +9 -1
  243. package/src/contracts/contracts.spec.ts +392 -0
  244. package/src/contracts/embed-event-payloads.ts +83 -0
  245. package/src/contracts/host-event-contracts.ts +456 -0
  246. package/src/contracts/index.ts +53 -0
  247. package/src/contracts/ui-passthrough-contracts.ts +301 -0
  248. package/src/embed/app.spec.ts +86 -34
  249. package/src/embed/app.ts +37 -264
  250. package/src/embed/events.spec.ts +14 -2
  251. package/src/embed/hostEventClient/host-event-client.spec.ts +2 -2
  252. package/src/embed/hostEventClient/host-event-client.ts +18 -5
  253. package/src/embed/hostEventClient/utils.ts +2 -1
  254. package/src/embed/liveboard.spec.ts +257 -38
  255. package/src/embed/liveboard.ts +75 -296
  256. package/src/embed/search.spec.ts +80 -0
  257. package/src/embed/search.ts +20 -0
  258. package/src/embed/ts-embed.spec.ts +448 -15
  259. package/src/embed/ts-embed.ts +109 -66
  260. package/src/full-height.spec.ts +1008 -0
  261. package/src/full-height.ts +361 -0
  262. package/src/index.ts +93 -5
  263. package/src/react/all-types-export.parity.spec.ts +63 -3
  264. package/src/react/all-types-export.ts +45 -0
  265. package/src/types.ts +540 -1
  266. package/src/utils/processTrigger.ts +28 -58
  267. package/src/utils/transport/iframe-transport.spec.ts +177 -0
  268. package/src/utils/transport/iframe-transport.ts +122 -0
  269. package/src/utils.spec.ts +71 -0
  270. package/src/utils.ts +38 -0
  271. package/cjs/src/embed/hostEventClient/contracts.d.ts +0 -231
  272. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  273. package/cjs/src/embed/hostEventClient/contracts.js.map +0 -1
  274. package/dist/src/embed/hostEventClient/contracts.d.ts +0 -231
  275. package/dist/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  276. package/lib/src/embed/hostEventClient/contracts.d.ts +0 -231
  277. package/lib/src/embed/hostEventClient/contracts.d.ts.map +0 -1
  278. package/lib/src/embed/hostEventClient/contracts.js.map +0 -1
  279. package/src/embed/hostEventClient/contracts.ts +0 -262
@@ -20,7 +20,7 @@ const logger_1 = require("../utils/logger");
20
20
  const package_json_1 = require("../../package.json");
21
21
  const search_1 = require("./search");
22
22
  const processTrigger_1 = require("../utils/processTrigger");
23
- const contracts_1 = require("./hostEventClient/contracts");
23
+ const ui_passthrough_contracts_1 = require("../contracts/ui-passthrough-contracts");
24
24
  const sessionInfoService = tslib_1.__importStar(require("../utils/sessionInfoService"));
25
25
  const authToken = tslib_1.__importStar(require("../authToken"));
26
26
  const apiIntercept = tslib_1.__importStar(require("../api-intercept"));
@@ -141,10 +141,10 @@ describe('Unit test case for ts embed', () => {
141
141
  mockProcessTrigger.mockResolvedValue({ session: 'test' });
142
142
  await (0, test_utils_1.executeAfterWait)(async () => {
143
143
  const payload = { newVizName: 'test' };
144
- await searchEmbed.triggerUIPassThrough(contracts_1.UIPassthroughEvent.PinAnswerToLiveboard, payload);
144
+ await searchEmbed.triggerUIPassThrough(ui_passthrough_contracts_1.UIPassthroughEvent.PinAnswerToLiveboard, payload);
145
145
  expect(mockProcessTrigger).toHaveBeenCalledWith((0, test_utils_1.getIFrameEl)(), types_1.HostEvent.UIPassthrough, 'http://tshost', {
146
146
  parameters: payload,
147
- type: contracts_1.UIPassthroughEvent.PinAnswerToLiveboard,
147
+ type: ui_passthrough_contracts_1.UIPassthroughEvent.PinAnswerToLiveboard,
148
148
  }, undefined);
149
149
  });
150
150
  });
@@ -168,6 +168,9 @@ describe('Unit test case for ts embed', () => {
168
168
  liveboardEmbed.render();
169
169
  mockProcessTrigger.mockResolvedValue({ session: 'test' });
170
170
  await (0, test_utils_1.executeAfterWait)(async () => {
171
+ // `false` is a deliberately off-contract payload here — this
172
+ // asserts raw passthrough to processTrigger, not a real Save
173
+ // payload — so it is cast past the typed `data` parameter.
171
174
  await liveboardEmbed.trigger(types_1.HostEvent.Save, false);
172
175
  expect(mockProcessTrigger).toHaveBeenCalledWith((0, test_utils_1.getIFrameEl)(), types_1.HostEvent.Save, 'http://tshost', false, undefined);
173
176
  });
@@ -3569,7 +3572,9 @@ describe('Unit test case for ts embed', () => {
3569
3572
  });
3570
3573
  test('should return getPreRenderObj and log if same object', () => {
3571
3574
  const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3572
- const loggerSpy = jest.spyOn(logger_1.logger, 'info');
3575
+ // debug, not info: the wrapper points at the embed being shown, so
3576
+ // this is now the common case rather than a rare diagnostic.
3577
+ const loggerSpy = jest.spyOn(logger_1.logger, 'debug');
3573
3578
  // getPreRenderObj reads the embed reference from preRenderWrapper
3574
3579
  searchEmbed.preRenderWrapper = {
3575
3580
  [searchEmbed['embedNodeKey']]: searchEmbed,
@@ -4271,16 +4276,6 @@ describe('Additional Coverage Tests', () => {
4271
4276
  expect((0, test_utils_1.getIFrameEl)().style.height).toBe('500px');
4272
4277
  });
4273
4278
  });
4274
- test('should test getIframeCenter calculation', async () => {
4275
- const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
4276
- await searchEmbed.render();
4277
- await (0, test_utils_1.executeAfterWait)(() => {
4278
- const center = searchEmbed['getIframeCenter']();
4279
- expect(center).toHaveProperty('iframeCenter');
4280
- expect(center).toHaveProperty('iframeHeight');
4281
- expect(center).toHaveProperty('viewPortHeight');
4282
- });
4283
- });
4284
4279
  test('should handle preRender with replaceExistingPreRender=true', async () => {
4285
4280
  (0, test_utils_1.createRootEleForEmbed)();
4286
4281
  const embed1 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
@@ -4353,7 +4348,7 @@ describe('Trigger method edge cases', () => {
4353
4348
  await searchEmbed.render();
4354
4349
  // First processTrigger call is getAvailableUIPassthroughKeys for DrillDown
4355
4350
  mockProcessTrigger.mockResolvedValueOnce([
4356
- { value: { keys: Object.values(contracts_1.UIPassthroughEvent) } },
4351
+ { value: { keys: Object.values(ui_passthrough_contracts_1.UIPassthroughEvent) } },
4357
4352
  ]);
4358
4353
  // DrillDown with no points → throwDrillDownValidationError → isValidationError=true
4359
4354
  await expect(searchEmbed.trigger(types_1.HostEvent.DrillDown, {})).rejects.toThrow('DrillDown requires a valid points object');
@@ -4580,7 +4575,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
4580
4575
  });
4581
4576
  embed2.showPreRender();
4582
4577
  await (0, test_utils_1.executeAfterWait)(() => {
4583
- expect(mockProcessTrigger).toHaveBeenLastCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4578
+ // Not LastCalledWith: LiveboardEmbed fires Navigate after this.
4579
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4584
4580
  liveboardId: 'original-lb',
4585
4581
  visibleVizs: ['viz-1'],
4586
4582
  runtimeFilters: [
@@ -4623,7 +4619,8 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
4623
4619
  });
4624
4620
  embed2.showPreRender();
4625
4621
  await (0, test_utils_1.executeAfterWait)(() => {
4626
- expect(mockProcessTrigger).toHaveBeenLastCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4622
+ // Not LastCalledWith: LiveboardEmbed fires Navigate after this.
4623
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4627
4624
  liveboardId: 'original-lb',
4628
4625
  visibleVizs: ['viz-1', 'viz-2'],
4629
4626
  runtimeFilters: [
@@ -4636,6 +4633,317 @@ describe('ShowPreRender with UpdateEmbedParams', () => {
4636
4633
  }), undefined);
4637
4634
  });
4638
4635
  });
4636
+ test('should carry the new config filters in UpdateEmbedParams', async () => {
4637
+ await setupPreRenderTest('params-new-filters', { liveboardId: 'original-lb' });
4638
+ const runtimeFilters = [
4639
+ {
4640
+ columnName: 'Color',
4641
+ operator: types_1.RuntimeFilterOp.IN,
4642
+ values: ['red', 'blue'],
4643
+ },
4644
+ ];
4645
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4646
+ preRenderId: 'params-new-filters',
4647
+ liveboardId: 'original-lb',
4648
+ runtimeFilters,
4649
+ });
4650
+ embed2.showPreRender();
4651
+ await (0, test_utils_1.executeAfterWait)(() => {
4652
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4653
+ runtimeFilters,
4654
+ // The serialized form is the one the container reads.
4655
+ runtimeFilterParams: 'col1=Color&op1=IN&val1=red&val1=blue',
4656
+ }), undefined);
4657
+ // Everything rides in the params payload; nothing follows it.
4658
+ const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateRuntimeFilters);
4659
+ expect(runtimeFilterCalls).toHaveLength(0);
4660
+ });
4661
+ });
4662
+ test('should serialize the filters when they are not excluded from the URL', async () => {
4663
+ await setupPreRenderTest('params-url-filters', { liveboardId: 'original-lb' });
4664
+ // With the flag off, getDefaultAppInitData leaves runtimeFilterParams
4665
+ // null and a URL render carries the filters in the iframe's query
4666
+ // string. A show cycle has no URL, so the payload has to carry them.
4667
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4668
+ preRenderId: 'params-url-filters',
4669
+ liveboardId: 'original-lb',
4670
+ excludeRuntimeFiltersfromURL: false,
4671
+ runtimeFilters: [
4672
+ {
4673
+ columnName: 'Color',
4674
+ operator: types_1.RuntimeFilterOp.IN,
4675
+ values: ['red'],
4676
+ },
4677
+ ],
4678
+ });
4679
+ embed2.showPreRender();
4680
+ await (0, test_utils_1.executeAfterWait)(() => {
4681
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4682
+ runtimeFilterParams: 'col1=Color&op1=IN&val1=red',
4683
+ }), undefined);
4684
+ });
4685
+ });
4686
+ test('should trigger Navigate only after UpdateEmbedParams has settled', async () => {
4687
+ await setupPreRenderTest('navigate-after-params', {
4688
+ liveboardId: 'original-lb',
4689
+ runtimeFilters: [
4690
+ {
4691
+ columnName: 'Color',
4692
+ operator: types_1.RuntimeFilterOp.IN,
4693
+ values: ['red'],
4694
+ },
4695
+ ],
4696
+ });
4697
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4698
+ preRenderId: 'navigate-after-params',
4699
+ liveboardId: 'updated-lb',
4700
+ });
4701
+ embed2.showPreRender();
4702
+ // Inside the settle window the params are already out
4703
+ // and Navigate is not.
4704
+ await (0, test_utils_1.executeAfterWait)(() => {
4705
+ const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
4706
+ expect(eventTypes).toContain(types_1.HostEvent.UpdateEmbedParams);
4707
+ expect(eventTypes).not.toContain(types_1.HostEvent.Navigate);
4708
+ }, 50);
4709
+ await (0, test_utils_1.executeAfterWait)(() => {
4710
+ const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
4711
+ // A Navigate that beat the params would make the container load
4712
+ // `updated-lb` while still holding `original-lb`'s runtime filters,
4713
+ // and drop the params that then arrive mid-load (SCAL-336321).
4714
+ expect(eventTypes).toContain(types_1.HostEvent.Navigate);
4715
+ expect(eventTypes.indexOf(types_1.HostEvent.UpdateEmbedParams)).toBeLessThan(eventTypes.indexOf(types_1.HostEvent.Navigate));
4716
+ }, 300);
4717
+ });
4718
+ test('should mark the params empty when the config declares no filters', async () => {
4719
+ await setupPreRenderTest('params-clear-filters', {
4720
+ liveboardId: 'original-lb',
4721
+ runtimeFilters: [
4722
+ {
4723
+ columnName: 'Color',
4724
+ operator: types_1.RuntimeFilterOp.IN,
4725
+ values: ['red', 'blue'],
4726
+ },
4727
+ ],
4728
+ });
4729
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4730
+ preRenderId: 'params-clear-filters',
4731
+ liveboardId: 'original-lb',
4732
+ });
4733
+ embed2.showPreRender();
4734
+ await (0, test_utils_1.executeAfterWait)(() => {
4735
+ // Not null and not '': the container only reads this field when it
4736
+ // is truthy, so either would leave the previous embed's filters in
4737
+ // place. A lone separator passes that gate and parses to {}.
4738
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
4739
+ const runtimeFilterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateRuntimeFilters);
4740
+ expect(runtimeFilterCalls).toHaveLength(0);
4741
+ });
4742
+ });
4743
+ test('should mark the params empty for an explicitly empty filter array', async () => {
4744
+ await setupPreRenderTest('params-empty-array', {
4745
+ liveboardId: 'original-lb',
4746
+ runtimeFilters: [
4747
+ {
4748
+ columnName: 'Color',
4749
+ operator: types_1.RuntimeFilterOp.IN,
4750
+ values: ['red'],
4751
+ },
4752
+ ],
4753
+ });
4754
+ // `runtimeFilters: []` is the shape the customer reported as not
4755
+ // resetting anything.
4756
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4757
+ preRenderId: 'params-empty-array',
4758
+ liveboardId: 'original-lb',
4759
+ runtimeFilters: [],
4760
+ });
4761
+ embed2.showPreRender();
4762
+ await (0, test_utils_1.executeAfterWait)(() => {
4763
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
4764
+ });
4765
+ });
4766
+ test('should mark the params empty when no config in the chain has filters', async () => {
4767
+ await setupPreRenderTest('params-no-filters', { liveboardId: 'original-lb' });
4768
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4769
+ preRenderId: 'params-no-filters',
4770
+ liveboardId: 'updated-lb',
4771
+ });
4772
+ embed2.showPreRender();
4773
+ await (0, test_utils_1.executeAfterWait)(() => {
4774
+ const paramsCall = mockProcessTrigger.mock.calls.find((call) => call[1] === types_1.HostEvent.UpdateEmbedParams);
4775
+ expect(paramsCall === null || paramsCall === void 0 ? void 0 : paramsCall[3]).not.toHaveProperty('runtimeFilters');
4776
+ expect(paramsCall === null || paramsCall === void 0 ? void 0 : paramsCall[3].runtimeFilterParams).toBe('&');
4777
+ });
4778
+ });
4779
+ test('should state each embed filters as the pre-render is handed along', async () => {
4780
+ await setupPreRenderTest('params-chain', {
4781
+ liveboardId: 'original-lb',
4782
+ runtimeFilters: [
4783
+ {
4784
+ columnName: 'Color',
4785
+ operator: types_1.RuntimeFilterOp.IN,
4786
+ values: ['red', 'blue'],
4787
+ },
4788
+ ],
4789
+ });
4790
+ // Second in the chain declares none, so it empties the field rather
4791
+ // than letting the creator's filters stand.
4792
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4793
+ preRenderId: 'params-chain',
4794
+ liveboardId: 'second-lb',
4795
+ });
4796
+ await embed2.showPreRender();
4797
+ await (0, test_utils_1.executeAfterWait)(() => {
4798
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeFilterParams: '&' }), undefined);
4799
+ });
4800
+ mockProcessTrigger.mockClear();
4801
+ // Third declares its own, and states them without reference to either
4802
+ // embed before it.
4803
+ const embed3 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4804
+ preRenderId: 'params-chain',
4805
+ liveboardId: 'third-lb',
4806
+ runtimeFilters: [
4807
+ {
4808
+ columnName: 'Region',
4809
+ operator: types_1.RuntimeFilterOp.EQ,
4810
+ values: ['North'],
4811
+ },
4812
+ ],
4813
+ });
4814
+ await embed3.showPreRender();
4815
+ await (0, test_utils_1.executeAfterWait)(() => {
4816
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4817
+ runtimeFilterParams: 'col1=Region&op1=EQ&val1=North',
4818
+ }), undefined);
4819
+ });
4820
+ });
4821
+ test('should carry the new config runtime parameters in UpdateEmbedParams', async () => {
4822
+ await setupPreRenderTest('params-parameters', {
4823
+ liveboardId: 'original-lb',
4824
+ runtimeParameters: [{ name: 'Region Param', value: 'East' }],
4825
+ });
4826
+ const runtimeParameters = [{ name: 'Region Param', value: 'West' }];
4827
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4828
+ preRenderId: 'params-parameters',
4829
+ liveboardId: 'original-lb',
4830
+ runtimeParameters,
4831
+ });
4832
+ embed2.showPreRender();
4833
+ await (0, test_utils_1.executeAfterWait)(() => {
4834
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4835
+ runtimeParameters,
4836
+ runtimeParameterParams: 'param1=Region%20Param&paramVal1=West',
4837
+ }), undefined);
4838
+ // A parameter always carries a value, so the payload says everything
4839
+ // there is to say — no follow-up event.
4840
+ const parameterCalls = mockProcessTrigger.mock.calls.filter((call) => call[1] === types_1.HostEvent.UpdateParameters);
4841
+ expect(parameterCalls).toHaveLength(0);
4842
+ });
4843
+ });
4844
+ test('should mark the params empty when the config declares no parameters', async () => {
4845
+ await setupPreRenderTest('params-clear-parameters', {
4846
+ liveboardId: 'original-lb',
4847
+ runtimeParameters: [{ name: 'Region Param', value: 'East' }],
4848
+ });
4849
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4850
+ preRenderId: 'params-clear-parameters',
4851
+ liveboardId: 'original-lb',
4852
+ });
4853
+ embed2.showPreRender();
4854
+ await (0, test_utils_1.executeAfterWait)(() => {
4855
+ // Same gate as the filters: the container only reads this field
4856
+ // when it is truthy, so null would leave 'East' standing.
4857
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({ runtimeParameterParams: '&' }), undefined);
4858
+ });
4859
+ });
4860
+ test('should keep an empty string parameter value distinct from having none', async () => {
4861
+ await setupPreRenderTest('params-empty-value', { liveboardId: 'original-lb' });
4862
+ // `paramVal1=` is that parameter's value, not an absence — so it must
4863
+ // not collapse to the empty marker.
4864
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4865
+ preRenderId: 'params-empty-value',
4866
+ liveboardId: 'original-lb',
4867
+ runtimeParameters: [{ name: 'Region Param', value: '' }],
4868
+ });
4869
+ embed2.showPreRender();
4870
+ await (0, test_utils_1.executeAfterWait)(() => {
4871
+ expect(mockProcessTrigger).toHaveBeenCalledWith(expect.any(Object), types_1.HostEvent.UpdateEmbedParams, expect.any(String), expect.objectContaining({
4872
+ runtimeParameterParams: 'param1=Region%20Param&paramVal1=',
4873
+ }), undefined);
4874
+ });
4875
+ });
4876
+ test('should hand the pre-render over to the embed being shown', async () => {
4877
+ const embed1 = await setupPreRenderTest('take-over-state', { liveboardId: 'original-lb' });
4878
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4879
+ preRenderId: 'take-over-state',
4880
+ liveboardId: 'second-lb',
4881
+ });
4882
+ await embed2.showPreRender();
4883
+ // It connected to embed1's pre-render and is now what the wrapper
4884
+ // points at, so getPreRenderObj() means "what is showing".
4885
+ expect(embed2.getPreRenderObj()).toBe(embed2);
4886
+ expect(embed1.getPreRenderObj()).toBe(embed2);
4887
+ });
4888
+ test('should not strand callbacks when the container loads after the shown embed was hidden', async () => {
4889
+ // The creator is subscribed but the container has NOT announced itself
4890
+ // yet, which is the state a real pre-render starts in.
4891
+ const embed1 = await setupPreRenderTest('loaded-after-hide', { liveboardId: 'original-lb' });
4892
+ embed1.isEmbedContainerLoaded = false;
4893
+ // Second embed shows, takes the pre-render over, then is hidden — which
4894
+ // unsubscribes it, so it will never hear EmbedListenerReady itself.
4895
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4896
+ preRenderId: 'loaded-after-hide',
4897
+ liveboardId: 'second-lb',
4898
+ });
4899
+ await embed2.showPreRender();
4900
+ embed2.hidePreRender();
4901
+ expect(embed2.isEmbedContainerLoaded).toBe(false);
4902
+ // Container comes up and the creator hears it.
4903
+ embed1.createEmbedContainerHandler(index_1.EmbedEvent.EmbedListenerReady)();
4904
+ mockProcessTrigger.mockClear();
4905
+ mockProcessTrigger.mockResolvedValue({});
4906
+ // A third embed reads the state off embed2, which owns the wrapper and
4907
+ // never learned the container was up. Reading a per-instance snapshot
4908
+ // here leaves UpdateEmbedParams queued forever and the pre-render stuck
4909
+ // on the previous liveboard.
4910
+ const embed3 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4911
+ preRenderId: 'loaded-after-hide',
4912
+ liveboardId: 'third-lb',
4913
+ });
4914
+ await embed3.showPreRender();
4915
+ expect(embed3.isEmbedContainerLoaded).toBe(true);
4916
+ await (0, test_utils_1.executeAfterWait)(() => {
4917
+ const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
4918
+ expect(eventTypes).toContain(types_1.HostEvent.UpdateEmbedParams);
4919
+ }, 300);
4920
+ });
4921
+ test('should not reconcile runtime filters unless the view config opts in', async () => {
4922
+ await setupPreRenderTest('reconcile-flag-off', {
4923
+ liveboardId: 'original-lb',
4924
+ runtimeFilters: [
4925
+ {
4926
+ columnName: 'Color',
4927
+ operator: types_1.RuntimeFilterOp.IN,
4928
+ values: ['red', 'blue'],
4929
+ },
4930
+ ],
4931
+ });
4932
+ // Same shape as the clear-filters case above, minus the flag: the
4933
+ // previous config left filters on the shared pre-render and this one
4934
+ // declares none. Without preRenderConfig.reconcileRuntimeParams the SDK
4935
+ // leaves that to the container, so no UpdateRuntimeFilters goes out.
4936
+ const embed2 = new index_1.LiveboardEmbed('#tsEmbedDiv', {
4937
+ preRenderId: 'reconcile-flag-off',
4938
+ liveboardId: 'original-lb',
4939
+ });
4940
+ embed2.showPreRender();
4941
+ await (0, test_utils_1.executeAfterWait)(() => {
4942
+ const eventTypes = mockProcessTrigger.mock.calls.map((call) => call[1]);
4943
+ expect(eventTypes).toContain(types_1.HostEvent.UpdateEmbedParams);
4944
+ expect(eventTypes).not.toContain(types_1.HostEvent.UpdateRuntimeFilters);
4945
+ });
4946
+ });
4639
4947
  test('should handle error when getUpdateEmbedParamsObject fails during showPreRender', async () => {
4640
4948
  await setupPreRenderTest('error-test', { liveboardId: 'original-lb' });
4641
4949
  const handleErrorSpy = jest.spyOn(index_1.LiveboardEmbed.prototype, 'handleError');