@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.
- package/cjs/package.json +1 -1
- package/cjs/src/config.d.ts +1 -0
- package/cjs/src/config.d.ts.map +1 -1
- package/cjs/src/config.js +2 -1
- package/cjs/src/config.js.map +1 -1
- package/cjs/src/css-variables.d.ts +63 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +148 -25
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +74 -37
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +571 -150
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts +1 -1
- package/cjs/src/embed/base.js +1 -1
- package/cjs/src/embed/conversation.d.ts +375 -2
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +21 -15
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +323 -17
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/events.spec.js +45 -0
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/host-events.spec.js +81 -0
- package/cjs/src/embed/host-events.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.d.ts +15 -0
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.js +1 -0
- package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +1 -0
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +27 -0
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +76 -14
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +50 -9
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +432 -4
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/spotter-utils.d.ts +15 -1
- package/cjs/src/embed/spotter-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-utils.js +28 -1
- package/cjs/src/embed/spotter-utils.js.map +1 -1
- package/cjs/src/embed/spotter-utils.spec.js +129 -0
- package/cjs/src/embed/spotter-utils.spec.js.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.d.ts +9 -10
- package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +16 -8
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +82 -30
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +537 -3
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +3 -3
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +3 -2
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/mixpanel-service.d.ts +4 -0
- package/cjs/src/mixpanel-service.d.ts.map +1 -1
- package/cjs/src/mixpanel-service.js +4 -0
- package/cjs/src/mixpanel-service.js.map +1 -1
- package/cjs/src/react/all-types-export.d.ts +1 -1
- package/cjs/src/react/all-types-export.d.ts.map +1 -1
- package/cjs/src/react/all-types-export.js +2 -1
- package/cjs/src/react/all-types-export.js.map +1 -1
- package/cjs/src/react/all-types-export.parity.spec.d.ts +2 -0
- package/cjs/src/react/all-types-export.parity.spec.d.ts.map +1 -0
- package/cjs/src/react/all-types-export.parity.spec.js +194 -0
- package/cjs/src/react/all-types-export.parity.spec.js.map +1 -0
- package/cjs/src/react/index.d.ts +66 -32
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +5 -3
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/react/index.spec.js +101 -0
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/types.d.ts +789 -32
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +610 -20
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils.spec.js +4 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-fCne7kmU.js → index-Bivg-mDx.js} +1 -1
- package/dist/src/config.d.ts +1 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +63 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +148 -25
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts +1 -1
- package/dist/src/embed/conversation.d.ts +375 -2
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +15 -0
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +76 -14
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/spotter-utils.d.ts +15 -1
- package/dist/src/embed/spotter-utils.d.ts.map +1 -1
- package/dist/src/embed/spotter-viz-utils.d.ts +9 -10
- package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +16 -8
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/mixpanel-service.d.ts +4 -0
- package/dist/src/mixpanel-service.d.ts.map +1 -1
- package/dist/src/react/all-types-export.d.ts +1 -1
- package/dist/src/react/all-types-export.d.ts.map +1 -1
- package/dist/src/react/all-types-export.parity.spec.d.ts +2 -0
- package/dist/src/react/all-types-export.parity.spec.d.ts.map +1 -0
- package/dist/src/react/index.d.ts +66 -32
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +789 -32
- package/dist/src/types.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +878 -120
- package/dist/tsembed-react.js +877 -119
- package/dist/tsembed.es.js +936 -181
- package/dist/tsembed.js +938 -183
- package/dist/visual-embed-sdk-react-full.d.ts +1553 -128
- package/dist/visual-embed-sdk-react.d.ts +1555 -129
- package/dist/visual-embed-sdk.d.ts +1499 -100
- package/lib/package.json +1 -1
- package/lib/src/config.d.ts +1 -0
- package/lib/src/config.d.ts.map +1 -1
- package/lib/src/config.js +1 -0
- package/lib/src/config.js.map +1 -1
- package/lib/src/css-variables.d.ts +63 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +148 -25
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +75 -38
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +572 -151
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts +1 -1
- package/lib/src/embed/base.js +1 -1
- package/lib/src/embed/conversation.d.ts +375 -2
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +23 -17
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +323 -17
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/events.spec.js +45 -0
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/host-events.spec.js +81 -0
- package/lib/src/embed/host-events.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +15 -0
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.js +1 -0
- package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +1 -0
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +27 -0
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +76 -14
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +50 -9
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +432 -4
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/spotter-utils.d.ts +15 -1
- package/lib/src/embed/spotter-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-utils.js +25 -0
- package/lib/src/embed/spotter-utils.js.map +1 -1
- package/lib/src/embed/spotter-utils.spec.js +130 -1
- package/lib/src/embed/spotter-utils.spec.js.map +1 -1
- package/lib/src/embed/spotter-viz-utils.d.ts +9 -10
- package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
- package/lib/src/embed/spotter-viz-utils.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +16 -8
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +82 -30
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +537 -3
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +3 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +2 -2
- package/lib/src/index.js.map +1 -1
- package/lib/src/mixpanel-service.d.ts +4 -0
- package/lib/src/mixpanel-service.d.ts.map +1 -1
- package/lib/src/mixpanel-service.js +4 -0
- package/lib/src/mixpanel-service.js.map +1 -1
- package/lib/src/react/all-types-export.d.ts +1 -1
- package/lib/src/react/all-types-export.d.ts.map +1 -1
- package/lib/src/react/all-types-export.js +1 -1
- package/lib/src/react/all-types-export.js.map +1 -1
- package/lib/src/react/all-types-export.parity.spec.d.ts +2 -0
- package/lib/src/react/all-types-export.parity.spec.d.ts.map +1 -0
- package/lib/src/react/all-types-export.parity.spec.js +191 -0
- package/lib/src/react/all-types-export.parity.spec.js.map +1 -0
- package/lib/src/react/index.d.ts +66 -32
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +5 -3
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/react/index.spec.js +102 -1
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/types.d.ts +789 -32
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +610 -20
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils.spec.js +4 -0
- package/lib/src/utils.spec.js.map +1 -1
- package/lib/src/visual-embed-sdk.d.ts +1499 -100
- package/package.json +1 -1
- package/src/config.ts +1 -0
- package/src/css-variables.ts +77 -0
- package/src/embed/app.spec.ts +729 -188
- package/src/embed/app.ts +240 -75
- package/src/embed/base.ts +1 -1
- package/src/embed/conversation.spec.ts +379 -20
- package/src/embed/conversation.ts +412 -18
- package/src/embed/events.spec.ts +56 -0
- package/src/embed/host-events.spec.ts +118 -0
- package/src/embed/hostEventClient/contracts.ts +16 -0
- package/src/embed/hostEventClient/host-event-client.spec.ts +46 -0
- package/src/embed/hostEventClient/host-event-client.ts +3 -2
- package/src/embed/liveboard.spec.ts +565 -4
- package/src/embed/liveboard.ts +150 -29
- package/src/embed/spotter-utils.spec.ts +140 -1
- package/src/embed/spotter-utils.ts +36 -1
- package/src/embed/spotter-viz-utils.ts +9 -10
- package/src/embed/ts-embed.spec.ts +699 -3
- package/src/embed/ts-embed.ts +99 -35
- package/src/index.ts +44 -2
- package/src/mixpanel-service.ts +4 -0
- package/src/react/all-types-export.parity.spec.ts +208 -0
- package/src/react/all-types-export.ts +22 -0
- package/src/react/index.spec.tsx +158 -0
- package/src/react/index.tsx +70 -33
- package/src/types.ts +791 -30
- 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>,
|