@thoughtspot/visual-embed-sdk 1.50.1 → 1.51.0-test

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 (238) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/config.d.ts +1 -0
  3. package/cjs/src/config.d.ts.map +1 -1
  4. package/cjs/src/config.js +2 -1
  5. package/cjs/src/config.js.map +1 -1
  6. package/cjs/src/css-variables.d.ts +63 -0
  7. package/cjs/src/css-variables.d.ts.map +1 -1
  8. package/cjs/src/embed/app.d.ts +148 -25
  9. package/cjs/src/embed/app.d.ts.map +1 -1
  10. package/cjs/src/embed/app.js +74 -37
  11. package/cjs/src/embed/app.js.map +1 -1
  12. package/cjs/src/embed/app.spec.js +571 -150
  13. package/cjs/src/embed/app.spec.js.map +1 -1
  14. package/cjs/src/embed/base.d.ts +1 -1
  15. package/cjs/src/embed/base.js +1 -1
  16. package/cjs/src/embed/conversation.d.ts +375 -2
  17. package/cjs/src/embed/conversation.d.ts.map +1 -1
  18. package/cjs/src/embed/conversation.js +21 -15
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/conversation.spec.js +323 -17
  21. package/cjs/src/embed/conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/events.spec.js +45 -0
  23. package/cjs/src/embed/events.spec.js.map +1 -1
  24. package/cjs/src/embed/host-events.spec.js +81 -0
  25. package/cjs/src/embed/host-events.spec.js.map +1 -1
  26. package/cjs/src/embed/hostEventClient/contracts.d.ts +15 -0
  27. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  28. package/cjs/src/embed/hostEventClient/contracts.js +1 -0
  29. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  30. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -1
  31. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  32. package/cjs/src/embed/hostEventClient/host-event-client.js +1 -0
  33. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  34. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +27 -0
  35. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  36. package/cjs/src/embed/liveboard.d.ts +76 -14
  37. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  38. package/cjs/src/embed/liveboard.js +50 -9
  39. package/cjs/src/embed/liveboard.js.map +1 -1
  40. package/cjs/src/embed/liveboard.spec.js +432 -4
  41. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  42. package/cjs/src/embed/spotter-utils.d.ts +15 -1
  43. package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
  44. package/cjs/src/embed/spotter-utils.js +28 -1
  45. package/cjs/src/embed/spotter-utils.js.map +1 -1
  46. package/cjs/src/embed/spotter-utils.spec.js +129 -0
  47. package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
  48. package/cjs/src/embed/spotter-viz-utils.d.ts +9 -10
  49. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  50. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  51. package/cjs/src/embed/ts-embed.d.ts +16 -8
  52. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  53. package/cjs/src/embed/ts-embed.js +82 -30
  54. package/cjs/src/embed/ts-embed.js.map +1 -1
  55. package/cjs/src/embed/ts-embed.spec.js +537 -3
  56. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  57. package/cjs/src/index.d.ts +3 -3
  58. package/cjs/src/index.d.ts.map +1 -1
  59. package/cjs/src/index.js +3 -2
  60. package/cjs/src/index.js.map +1 -1
  61. package/cjs/src/mixpanel-service.d.ts +4 -0
  62. package/cjs/src/mixpanel-service.d.ts.map +1 -1
  63. package/cjs/src/mixpanel-service.js +4 -0
  64. package/cjs/src/mixpanel-service.js.map +1 -1
  65. package/cjs/src/react/all-types-export.d.ts +1 -1
  66. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  67. package/cjs/src/react/all-types-export.js +2 -1
  68. package/cjs/src/react/all-types-export.js.map +1 -1
  69. package/cjs/src/react/all-types-export.parity.spec.d.ts +2 -0
  70. package/cjs/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  71. package/cjs/src/react/all-types-export.parity.spec.js +194 -0
  72. package/cjs/src/react/all-types-export.parity.spec.js.map +1 -0
  73. package/cjs/src/react/index.d.ts +66 -32
  74. package/cjs/src/react/index.d.ts.map +1 -1
  75. package/cjs/src/react/index.js +5 -3
  76. package/cjs/src/react/index.js.map +1 -1
  77. package/cjs/src/react/index.spec.js +101 -0
  78. package/cjs/src/react/index.spec.js.map +1 -1
  79. package/cjs/src/types.d.ts +789 -32
  80. package/cjs/src/types.d.ts.map +1 -1
  81. package/cjs/src/types.js +610 -20
  82. package/cjs/src/types.js.map +1 -1
  83. package/cjs/src/utils.spec.js +4 -0
  84. package/cjs/src/utils.spec.js.map +1 -1
  85. package/dist/{index-fCne7kmU.js → index-Bivg-mDx.js} +1 -1
  86. package/dist/src/config.d.ts +1 -0
  87. package/dist/src/config.d.ts.map +1 -1
  88. package/dist/src/css-variables.d.ts +63 -0
  89. package/dist/src/css-variables.d.ts.map +1 -1
  90. package/dist/src/embed/app.d.ts +148 -25
  91. package/dist/src/embed/app.d.ts.map +1 -1
  92. package/dist/src/embed/base.d.ts +1 -1
  93. package/dist/src/embed/conversation.d.ts +375 -2
  94. package/dist/src/embed/conversation.d.ts.map +1 -1
  95. package/dist/src/embed/hostEventClient/contracts.d.ts +15 -0
  96. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  97. package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -1
  98. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  99. package/dist/src/embed/liveboard.d.ts +76 -14
  100. package/dist/src/embed/liveboard.d.ts.map +1 -1
  101. package/dist/src/embed/spotter-utils.d.ts +15 -1
  102. package/dist/src/embed/spotter-utils.d.ts.map +1 -1
  103. package/dist/src/embed/spotter-viz-utils.d.ts +9 -10
  104. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  105. package/dist/src/embed/ts-embed.d.ts +16 -8
  106. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  107. package/dist/src/index.d.ts +3 -3
  108. package/dist/src/index.d.ts.map +1 -1
  109. package/dist/src/mixpanel-service.d.ts +4 -0
  110. package/dist/src/mixpanel-service.d.ts.map +1 -1
  111. package/dist/src/react/all-types-export.d.ts +1 -1
  112. package/dist/src/react/all-types-export.d.ts.map +1 -1
  113. package/dist/src/react/all-types-export.parity.spec.d.ts +2 -0
  114. package/dist/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  115. package/dist/src/react/index.d.ts +66 -32
  116. package/dist/src/react/index.d.ts.map +1 -1
  117. package/dist/src/types.d.ts +789 -32
  118. package/dist/src/types.d.ts.map +1 -1
  119. package/dist/tsembed-react.es.js +878 -120
  120. package/dist/tsembed-react.js +877 -119
  121. package/dist/tsembed.es.js +936 -181
  122. package/dist/tsembed.js +938 -183
  123. package/dist/visual-embed-sdk-react-full.d.ts +1553 -128
  124. package/dist/visual-embed-sdk-react.d.ts +1555 -129
  125. package/dist/visual-embed-sdk.d.ts +1499 -100
  126. package/lib/package.json +1 -1
  127. package/lib/src/config.d.ts +1 -0
  128. package/lib/src/config.d.ts.map +1 -1
  129. package/lib/src/config.js +1 -0
  130. package/lib/src/config.js.map +1 -1
  131. package/lib/src/css-variables.d.ts +63 -0
  132. package/lib/src/css-variables.d.ts.map +1 -1
  133. package/lib/src/embed/app.d.ts +148 -25
  134. package/lib/src/embed/app.d.ts.map +1 -1
  135. package/lib/src/embed/app.js +75 -38
  136. package/lib/src/embed/app.js.map +1 -1
  137. package/lib/src/embed/app.spec.js +572 -151
  138. package/lib/src/embed/app.spec.js.map +1 -1
  139. package/lib/src/embed/base.d.ts +1 -1
  140. package/lib/src/embed/base.js +1 -1
  141. package/lib/src/embed/conversation.d.ts +375 -2
  142. package/lib/src/embed/conversation.d.ts.map +1 -1
  143. package/lib/src/embed/conversation.js +23 -17
  144. package/lib/src/embed/conversation.js.map +1 -1
  145. package/lib/src/embed/conversation.spec.js +323 -17
  146. package/lib/src/embed/conversation.spec.js.map +1 -1
  147. package/lib/src/embed/events.spec.js +45 -0
  148. package/lib/src/embed/events.spec.js.map +1 -1
  149. package/lib/src/embed/host-events.spec.js +81 -0
  150. package/lib/src/embed/host-events.spec.js.map +1 -1
  151. package/lib/src/embed/hostEventClient/contracts.d.ts +15 -0
  152. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  153. package/lib/src/embed/hostEventClient/contracts.js +1 -0
  154. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  155. package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -1
  156. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  157. package/lib/src/embed/hostEventClient/host-event-client.js +1 -0
  158. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  159. package/lib/src/embed/hostEventClient/host-event-client.spec.js +27 -0
  160. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  161. package/lib/src/embed/liveboard.d.ts +76 -14
  162. package/lib/src/embed/liveboard.d.ts.map +1 -1
  163. package/lib/src/embed/liveboard.js +50 -9
  164. package/lib/src/embed/liveboard.js.map +1 -1
  165. package/lib/src/embed/liveboard.spec.js +432 -4
  166. package/lib/src/embed/liveboard.spec.js.map +1 -1
  167. package/lib/src/embed/spotter-utils.d.ts +15 -1
  168. package/lib/src/embed/spotter-utils.d.ts.map +1 -1
  169. package/lib/src/embed/spotter-utils.js +25 -0
  170. package/lib/src/embed/spotter-utils.js.map +1 -1
  171. package/lib/src/embed/spotter-utils.spec.js +130 -1
  172. package/lib/src/embed/spotter-utils.spec.js.map +1 -1
  173. package/lib/src/embed/spotter-viz-utils.d.ts +9 -10
  174. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  175. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  176. package/lib/src/embed/ts-embed.d.ts +16 -8
  177. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  178. package/lib/src/embed/ts-embed.js +82 -30
  179. package/lib/src/embed/ts-embed.js.map +1 -1
  180. package/lib/src/embed/ts-embed.spec.js +537 -3
  181. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  182. package/lib/src/index.d.ts +3 -3
  183. package/lib/src/index.d.ts.map +1 -1
  184. package/lib/src/index.js +2 -2
  185. package/lib/src/index.js.map +1 -1
  186. package/lib/src/mixpanel-service.d.ts +4 -0
  187. package/lib/src/mixpanel-service.d.ts.map +1 -1
  188. package/lib/src/mixpanel-service.js +4 -0
  189. package/lib/src/mixpanel-service.js.map +1 -1
  190. package/lib/src/react/all-types-export.d.ts +1 -1
  191. package/lib/src/react/all-types-export.d.ts.map +1 -1
  192. package/lib/src/react/all-types-export.js +1 -1
  193. package/lib/src/react/all-types-export.js.map +1 -1
  194. package/lib/src/react/all-types-export.parity.spec.d.ts +2 -0
  195. package/lib/src/react/all-types-export.parity.spec.d.ts.map +1 -0
  196. package/lib/src/react/all-types-export.parity.spec.js +191 -0
  197. package/lib/src/react/all-types-export.parity.spec.js.map +1 -0
  198. package/lib/src/react/index.d.ts +66 -32
  199. package/lib/src/react/index.d.ts.map +1 -1
  200. package/lib/src/react/index.js +5 -3
  201. package/lib/src/react/index.js.map +1 -1
  202. package/lib/src/react/index.spec.js +102 -1
  203. package/lib/src/react/index.spec.js.map +1 -1
  204. package/lib/src/types.d.ts +789 -32
  205. package/lib/src/types.d.ts.map +1 -1
  206. package/lib/src/types.js +610 -20
  207. package/lib/src/types.js.map +1 -1
  208. package/lib/src/utils.spec.js +4 -0
  209. package/lib/src/utils.spec.js.map +1 -1
  210. package/lib/src/visual-embed-sdk.d.ts +1499 -100
  211. package/package.json +1 -1
  212. package/src/config.ts +1 -0
  213. package/src/css-variables.ts +77 -0
  214. package/src/embed/app.spec.ts +729 -188
  215. package/src/embed/app.ts +240 -75
  216. package/src/embed/base.ts +1 -1
  217. package/src/embed/conversation.spec.ts +379 -20
  218. package/src/embed/conversation.ts +412 -18
  219. package/src/embed/events.spec.ts +56 -0
  220. package/src/embed/host-events.spec.ts +118 -0
  221. package/src/embed/hostEventClient/contracts.ts +16 -0
  222. package/src/embed/hostEventClient/host-event-client.spec.ts +46 -0
  223. package/src/embed/hostEventClient/host-event-client.ts +3 -2
  224. package/src/embed/liveboard.spec.ts +565 -4
  225. package/src/embed/liveboard.ts +150 -29
  226. package/src/embed/spotter-utils.spec.ts +140 -1
  227. package/src/embed/spotter-utils.ts +36 -1
  228. package/src/embed/spotter-viz-utils.ts +9 -10
  229. package/src/embed/ts-embed.spec.ts +699 -3
  230. package/src/embed/ts-embed.ts +99 -35
  231. package/src/index.ts +44 -2
  232. package/src/mixpanel-service.ts +4 -0
  233. package/src/react/all-types-export.parity.spec.ts +208 -0
  234. package/src/react/all-types-export.ts +22 -0
  235. package/src/react/index.spec.tsx +158 -0
  236. package/src/react/index.tsx +70 -33
  237. package/src/types.ts +791 -30
  238. package/src/utils.spec.ts +5 -0
@@ -149,6 +149,85 @@ describe('HostEvent.OpenFilter', () => {
149
149
  });
150
150
  });
151
151
 
152
+ // ---------------------------------------------------------------------------
153
+ // 10b – OpenParameter
154
+ // ---------------------------------------------------------------------------
155
+ describe('HostEvent.OpenParameter', () => {
156
+ test('postMessage type is openParameter (camelCase)', async () => {
157
+ mockMessageChannel();
158
+ const { lb, iframe } = await renderLiveboard();
159
+ await executeAfterWait(() => {
160
+ lb.trigger(HostEvent.OpenParameter, { parameter: { parameterId: 'p1' } } as any);
161
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
162
+ expect.objectContaining({ type: 'openParameter' }),
163
+ thoughtSpotHost,
164
+ expect.anything(),
165
+ );
166
+ });
167
+ });
168
+
169
+ test('accepts a payload with only parameterName', async () => {
170
+ mockMessageChannel();
171
+ const { lb, iframe } = await renderLiveboard();
172
+ await executeAfterWait(() => {
173
+ lb.trigger(HostEvent.OpenParameter, { parameter: { parameterName: 'Param 1' } } as any);
174
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
175
+ expect.objectContaining({ type: 'openParameter' }),
176
+ thoughtSpotHost,
177
+ expect.anything(),
178
+ );
179
+ });
180
+ });
181
+ });
182
+
183
+ // ---------------------------------------------------------------------------
184
+ // 10c – OpenAddFilterModal
185
+ // ---------------------------------------------------------------------------
186
+ describe('HostEvent.OpenAddFilterModal', () => {
187
+ test('postMessage type is openAddFilterModal (camelCase, no payload)', async () => {
188
+ mockMessageChannel();
189
+ const { lb, iframe } = await renderLiveboard();
190
+ await executeAfterWait(() => {
191
+ lb.trigger(HostEvent.OpenAddFilterModal);
192
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
193
+ expect.objectContaining({ type: 'openAddFilterModal' }),
194
+ thoughtSpotHost,
195
+ expect.anything(),
196
+ );
197
+ });
198
+ });
199
+
200
+ test('returns null when !isRendered', async () => {
201
+ const lb = unrenderedLiveboard();
202
+ const result = await lb.trigger(HostEvent.OpenAddFilterModal);
203
+ expect(result).toBeNull();
204
+ });
205
+ });
206
+
207
+ // ---------------------------------------------------------------------------
208
+ // 10d – OpenAddParameterModal
209
+ // ---------------------------------------------------------------------------
210
+ describe('HostEvent.OpenAddParameterModal', () => {
211
+ test('postMessage type is openAddParameterModal (camelCase, no payload)', async () => {
212
+ mockMessageChannel();
213
+ const { lb, iframe } = await renderLiveboard();
214
+ await executeAfterWait(() => {
215
+ lb.trigger(HostEvent.OpenAddParameterModal);
216
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
217
+ expect.objectContaining({ type: 'openAddParameterModal' }),
218
+ thoughtSpotHost,
219
+ expect.anything(),
220
+ );
221
+ });
222
+ });
223
+
224
+ test('returns null when !isRendered', async () => {
225
+ const lb = unrenderedLiveboard();
226
+ const result = await lb.trigger(HostEvent.OpenAddParameterModal);
227
+ expect(result).toBeNull();
228
+ });
229
+ });
230
+
152
231
  // ---------------------------------------------------------------------------
153
232
  // 11 – AddColumns
154
233
  // ---------------------------------------------------------------------------
@@ -1757,3 +1836,42 @@ describe('HostEvent.DownloadAsCsv — additional cases', () => {
1757
1836
  expect(result).toBeNull();
1758
1837
  });
1759
1838
  });
1839
+
1840
+ // ---------------------------------------------------------------------------
1841
+ // Spotter share-conversation HostEvents
1842
+ // ---------------------------------------------------------------------------
1843
+ describe('Spotter share-conversation HostEvents', () => {
1844
+ const shareEvents: Array<[string, HostEvent, string, any]> = [
1845
+ ['ShareSpotterConversation', HostEvent.ShareSpotterConversation, 'ShareSpotterConversation', { conversationId: 'abc' }],
1846
+ ['CloseSpotterShareConversation', HostEvent.CloseSpotterShareConversation, 'CloseSpotterShareConversation', {}],
1847
+ ['ExitSpotterSharedConversation', HostEvent.ExitSpotterSharedConversation, 'ExitSpotterSharedConversation', {}],
1848
+ ];
1849
+
1850
+ test.each(shareEvents)(
1851
+ '%s: postMessage type is the matching string value',
1852
+ async (name, event, typeString, payload) => {
1853
+ mockMessageChannel();
1854
+ const { lb, iframe } = await renderLiveboard();
1855
+ await executeAfterWait(() => {
1856
+ lb.trigger(event, payload as any);
1857
+ expect(iframe.contentWindow.postMessage).toHaveBeenCalledWith(
1858
+ expect.objectContaining({ type: typeString }),
1859
+ thoughtSpotHost,
1860
+ expect.anything(),
1861
+ );
1862
+ });
1863
+ },
1864
+ );
1865
+
1866
+ test.each(shareEvents)(
1867
+ '%s: returns null and calls handleError when !isRendered',
1868
+ async (name, event, typeString, payload) => {
1869
+ const lb = unrenderedLiveboard();
1870
+ const result = await lb.trigger(event, payload as any);
1871
+ expect(result).toBeNull();
1872
+ expect((lb as any).handleError).toHaveBeenCalledWith(
1873
+ expect.objectContaining({ code: EmbedErrorCodes.RENDER_NOT_CALLED }),
1874
+ );
1875
+ },
1876
+ );
1877
+ });
@@ -7,6 +7,12 @@ export interface LiveboardTab {
7
7
  [key: string]: any;
8
8
  }
9
9
 
10
+ export interface LiveboardGroup {
11
+ id: string;
12
+ name: string;
13
+ [key: string]: any;
14
+ }
15
+
10
16
  /**
11
17
  * Levels at which a filter or parameter can be applied.
12
18
  */
@@ -60,6 +66,7 @@ export enum UIPassthroughEvent {
60
66
  GetParameters = 'getParameters',
61
67
  GetTML = 'getTML',
62
68
  GetTabs = 'getTabs',
69
+ GetGroups = 'getGroups',
63
70
  GetExportRequestForCurrentPinboard = 'getExportRequestForCurrentPinboard',
64
71
  }
65
72
 
@@ -171,6 +178,14 @@ export type UIPassthroughContractBase = {
171
178
  Tabs: LiveboardTab[];
172
179
  };
173
180
  };
181
+ [UIPassthroughEvent.GetGroups]: {
182
+ request: Record<string, never>;
183
+ response: {
184
+ orderedGroupIds: string[];
185
+ numberOfGroups: number;
186
+ Groups: LiveboardGroup[];
187
+ };
188
+ };
174
189
  [UIPassthroughEvent.GetExportRequestForCurrentPinboard]: {
175
190
  request: Record<string, never>;
176
191
  response: {
@@ -225,6 +240,7 @@ export type EmbedApiHostEventMapping = {
225
240
  [HostEvent.GetParameters]: UIPassthroughEvent.GetParameters;
226
241
  [HostEvent.GetTML]: UIPassthroughEvent.GetTML;
227
242
  [HostEvent.GetTabs]: UIPassthroughEvent.GetTabs;
243
+ [HostEvent.GetGroups]: UIPassthroughEvent.GetGroups;
228
244
  [HostEvent.getExportRequestForCurrentPinboard]: UIPassthroughEvent.GetExportRequestForCurrentPinboard;
229
245
  }
230
246
 
@@ -375,6 +375,18 @@ describe('HostEventClient', () => {
375
375
  );
376
376
  });
377
377
 
378
+ it('should route GetGroups through passthrough and return data', async () => {
379
+ const { client } = createHostEventClient();
380
+ const mockResponse = [{ value: { orderedGroupIds: ['g1', 'g2'], numberOfGroups: 2, Groups: [] as any[] } }];
381
+ mockProcessTrigger
382
+ .mockResolvedValueOnce(mockGetAvailablePassthroughs())
383
+ .mockResolvedValueOnce(mockResponse);
384
+
385
+ const result = await client.triggerHostEvent(HostEvent.GetGroups, {});
386
+
387
+ expect(result).toEqual({ orderedGroupIds: ['g1', 'g2'], numberOfGroups: 2, Groups: [] });
388
+ });
389
+
378
390
  it('should throw when DrillDown payload has no valid points', async () => {
379
391
  const { client } = createHostEventClient();
380
392
  const invalidPayload = {} as any;
@@ -1142,4 +1154,38 @@ describe('HostEventClient', () => {
1142
1154
  expect(result.answerId).toBeUndefined();
1143
1155
  });
1144
1156
  });
1157
+
1158
+ describe('trigger typing contracts (compile-time)', () => {
1159
+ // These assertions are enforced by ts-jest at compile time; the runtime
1160
+ // expect() is trivial. They lock the PayloadT default on
1161
+ // triggerHostEvent: no-payload calls must infer the contract response
1162
+ // instead of collapsing to `any`.
1163
+ type IsAny<T> = 0 extends 1 & T ? true : false;
1164
+ type Extends<A, B> = A extends B ? true : false;
1165
+
1166
+ it('infers typed response for no-payload contracted events and keeps any for uncontracted', () => {
1167
+ const { client } = createHostEventClient();
1168
+
1169
+ // Contracted event, called with no payload — the fixed case.
1170
+ const getTabs = () => client.triggerHostEvent(HostEvent.GetTabs);
1171
+ type TabsResponse = Awaited<ReturnType<typeof getTabs>>;
1172
+ const tabsIsTyped: IsAny<TabsResponse> = false;
1173
+ const tabsHasContractFields: Extends<
1174
+ TabsResponse,
1175
+ { numberOfTabs: number; orderedTabIds: string[] }
1176
+ > = true;
1177
+ const probeUnknownField = (r: TabsResponse) =>
1178
+ // @ts-expect-error — field not on the GetTabs contract (was silent when `any`)
1179
+ r.tabCount;
1180
+ void probeUnknownField;
1181
+
1182
+ // Uncontracted event — must remain `any` with or without payload.
1183
+ const reload = () => client.triggerHostEvent(HostEvent.Reload);
1184
+ type ReloadResponse = Awaited<ReturnType<typeof reload>>;
1185
+ const reloadStaysAny: IsAny<ReloadResponse> = true;
1186
+
1187
+ expect([tabsIsTyped, tabsHasContractFields, reloadStaysAny])
1188
+ .toEqual([false, true, true]);
1189
+ });
1190
+ });
1145
1191
  });
@@ -38,6 +38,7 @@ const PASSTHROUGH_MAP: Partial<Record<HostEvent, UIPassthroughEvent>> = {
38
38
  [HostEvent.GetParameters]: UIPassthroughEvent.GetParameters,
39
39
  [HostEvent.GetTML]: UIPassthroughEvent.GetTML,
40
40
  [HostEvent.GetTabs]: UIPassthroughEvent.GetTabs,
41
+ [HostEvent.GetGroups]: UIPassthroughEvent.GetGroups,
41
42
  [HostEvent.getExportRequestForCurrentPinboard]: UIPassthroughEvent.GetExportRequestForCurrentPinboard,
42
43
  };
43
44
 
@@ -280,8 +281,8 @@ export class HostEventClient {
280
281
  */
281
282
  public async triggerHostEvent<
282
283
  HostEventT extends HostEvent,
283
- PayloadT,
284
- ContextT extends ContextType,
284
+ PayloadT = HostEventRequest<HostEventT>,
285
+ ContextT extends ContextType = ContextType,
285
286
  >(
286
287
  hostEvent: HostEventT,
287
288
  payload?: TriggerPayload<PayloadT, HostEventT>,