@thoughtspot/visual-embed-sdk 1.35.5 → 1.35.7

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 (124) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/embed/search-bar.d.ts +24 -1
  3. package/cjs/src/embed/search-bar.d.ts.map +1 -1
  4. package/cjs/src/embed/search-bar.js +13 -2
  5. package/cjs/src/embed/search-bar.js.map +1 -1
  6. package/cjs/src/embed/search.d.ts +26 -1
  7. package/cjs/src/embed/search.d.ts.map +1 -1
  8. package/cjs/src/embed/search.js +16 -2
  9. package/cjs/src/embed/search.js.map +1 -1
  10. package/cjs/src/embed/search.spec.js +49 -0
  11. package/cjs/src/embed/search.spec.js.map +1 -1
  12. package/cjs/src/embed/searchEmbed-basic-auth.spec.d.ts +2 -0
  13. package/cjs/src/embed/searchEmbed-basic-auth.spec.d.ts.map +1 -0
  14. package/cjs/src/embed/searchEmbed-basic-auth.spec.js +104 -0
  15. package/cjs/src/embed/searchEmbed-basic-auth.spec.js.map +1 -0
  16. package/cjs/src/embed/ts-embed.d.ts +4 -1
  17. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  18. package/cjs/src/embed/ts-embed.js +49 -31
  19. package/cjs/src/embed/ts-embed.js.map +1 -1
  20. package/cjs/src/embed/ts-embed.spec.js +187 -108
  21. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  22. package/cjs/src/hostEventsTypeMapping.d.ts +2 -0
  23. package/cjs/src/hostEventsTypeMapping.d.ts.map +1 -0
  24. package/cjs/src/hostEventsTypeMapping.js +4 -0
  25. package/cjs/src/hostEventsTypeMapping.js.map +1 -0
  26. package/cjs/src/types.d.ts +27 -0
  27. package/cjs/src/types.d.ts.map +1 -1
  28. package/cjs/src/types.js.map +1 -1
  29. package/cjs/src/utils/embedApi/contracts.d.ts +101 -0
  30. package/cjs/src/utils/embedApi/contracts.d.ts.map +1 -0
  31. package/cjs/src/utils/embedApi/contracts.js +17 -0
  32. package/cjs/src/utils/embedApi/contracts.js.map +1 -0
  33. package/cjs/src/utils/embedApi/embedApiClient.d.ts +12 -0
  34. package/cjs/src/utils/embedApi/embedApiClient.d.ts.map +1 -0
  35. package/cjs/src/utils/embedApi/embedApiClient.js +46 -0
  36. package/cjs/src/utils/embedApi/embedApiClient.js.map +1 -0
  37. package/cjs/src/utils/embedApi/processEmbedApi.d.ts +9 -0
  38. package/cjs/src/utils/embedApi/processEmbedApi.d.ts.map +1 -0
  39. package/cjs/src/utils/embedApi/processEmbedApi.js +18 -0
  40. package/cjs/src/utils/embedApi/processEmbedApi.js.map +1 -0
  41. package/dist/{index-FKywZXHG.js → index-BBBimG1x.js} +1 -1
  42. package/dist/index-CENLvayL.js +7370 -0
  43. package/dist/index-CbltIawo.js +7370 -0
  44. package/dist/index-CoQfqaHj.js +7370 -0
  45. package/dist/index-CzwzS0P4.js +7370 -0
  46. package/dist/index-DFwi_pV_.js +7370 -0
  47. package/dist/index-DOIjN0N_.js +7370 -0
  48. package/dist/index-DYBx8SuE.js +7370 -0
  49. package/dist/index-DaLHJaLd.js +7370 -0
  50. package/dist/index-DnJX-gN2.js +7370 -0
  51. package/dist/index-nWevLycs.js +7370 -0
  52. package/dist/src/embed/search-bar.d.ts +24 -1
  53. package/dist/src/embed/search-bar.d.ts.map +1 -1
  54. package/dist/src/embed/search.d.ts +26 -1
  55. package/dist/src/embed/search.d.ts.map +1 -1
  56. package/dist/src/embed/searchEmbed-basic-auth.spec.d.ts +2 -0
  57. package/dist/src/embed/searchEmbed-basic-auth.spec.d.ts.map +1 -0
  58. package/dist/src/embed/ts-embed.d.ts +4 -1
  59. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  60. package/dist/src/hostEventsTypeMapping.d.ts +2 -0
  61. package/dist/src/hostEventsTypeMapping.d.ts.map +1 -0
  62. package/dist/src/types.d.ts +27 -0
  63. package/dist/src/types.d.ts.map +1 -1
  64. package/dist/src/utils/embedApi/contracts.d.ts +101 -0
  65. package/dist/src/utils/embedApi/contracts.d.ts.map +1 -0
  66. package/dist/src/utils/embedApi/embedApiClient.d.ts +12 -0
  67. package/dist/src/utils/embedApi/embedApiClient.d.ts.map +1 -0
  68. package/dist/src/utils/embedApi/processEmbedApi.d.ts +9 -0
  69. package/dist/src/utils/embedApi/processEmbedApi.d.ts.map +1 -0
  70. package/dist/tsembed-react.es.js +81 -38
  71. package/dist/tsembed-react.js +80 -37
  72. package/dist/tsembed.es.js +81 -38
  73. package/dist/tsembed.js +80 -37
  74. package/dist/visual-embed-sdk-react-full.d.ts +78 -0
  75. package/dist/visual-embed-sdk-react.d.ts +78 -0
  76. package/dist/visual-embed-sdk.d.ts +78 -0
  77. package/lib/package.json +1 -1
  78. package/lib/src/embed/search-bar.d.ts +24 -1
  79. package/lib/src/embed/search-bar.d.ts.map +1 -1
  80. package/lib/src/embed/search-bar.js +13 -2
  81. package/lib/src/embed/search-bar.js.map +1 -1
  82. package/lib/src/embed/search.d.ts +26 -1
  83. package/lib/src/embed/search.d.ts.map +1 -1
  84. package/lib/src/embed/search.js +16 -2
  85. package/lib/src/embed/search.js.map +1 -1
  86. package/lib/src/embed/search.spec.js +51 -2
  87. package/lib/src/embed/search.spec.js.map +1 -1
  88. package/lib/src/embed/searchEmbed-basic-auth.spec.d.ts +2 -0
  89. package/lib/src/embed/searchEmbed-basic-auth.spec.d.ts.map +1 -0
  90. package/lib/src/embed/searchEmbed-basic-auth.spec.js +101 -0
  91. package/lib/src/embed/searchEmbed-basic-auth.spec.js.map +1 -0
  92. package/lib/src/embed/ts-embed.d.ts +4 -1
  93. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  94. package/lib/src/embed/ts-embed.js +49 -31
  95. package/lib/src/embed/ts-embed.js.map +1 -1
  96. package/lib/src/embed/ts-embed.spec.js +187 -108
  97. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  98. package/lib/src/hostEventsTypeMapping.d.ts +2 -0
  99. package/lib/src/hostEventsTypeMapping.d.ts.map +1 -0
  100. package/lib/src/hostEventsTypeMapping.js +2 -0
  101. package/lib/src/hostEventsTypeMapping.js.map +1 -0
  102. package/lib/src/types.d.ts +27 -0
  103. package/lib/src/types.d.ts.map +1 -1
  104. package/lib/src/types.js.map +1 -1
  105. package/lib/src/utils/embedApi/contracts.d.ts +101 -0
  106. package/lib/src/utils/embedApi/contracts.d.ts.map +1 -0
  107. package/lib/src/utils/embedApi/contracts.js +14 -0
  108. package/lib/src/utils/embedApi/contracts.js.map +1 -0
  109. package/lib/src/utils/embedApi/embedApiClient.d.ts +12 -0
  110. package/lib/src/utils/embedApi/embedApiClient.d.ts.map +1 -0
  111. package/lib/src/utils/embedApi/embedApiClient.js +42 -0
  112. package/lib/src/utils/embedApi/embedApiClient.js.map +1 -0
  113. package/lib/src/utils/embedApi/processEmbedApi.d.ts +9 -0
  114. package/lib/src/utils/embedApi/processEmbedApi.d.ts.map +1 -0
  115. package/lib/src/utils/embedApi/processEmbedApi.js +14 -0
  116. package/lib/src/utils/embedApi/processEmbedApi.js.map +1 -0
  117. package/lib/src/visual-embed-sdk.d.ts +81 -3
  118. package/package.json +1 -1
  119. package/src/embed/search-bar.tsx +36 -2
  120. package/src/embed/search.spec.ts +66 -1
  121. package/src/embed/search.ts +38 -1
  122. package/src/embed/ts-embed.spec.ts +205 -113
  123. package/src/embed/ts-embed.ts +52 -30
  124. package/src/types.ts +28 -0
@@ -96,6 +96,11 @@ const customisationsView = {
96
96
  },
97
97
  };
98
98
 
99
+ const customVariablesForThirdPartyTools = {
100
+ key1: '!@#',
101
+ key2: '*%^',
102
+ };
103
+
99
104
  describe('Unit test case for ts embed', () => {
100
105
  const mockMixPanelEvent = jest.spyOn(mixpanelInstance, 'uploadMixpanelEvent');
101
106
  beforeEach(() => {
@@ -148,11 +153,9 @@ describe('Unit test case for ts embed', () => {
148
153
  mockProcessTrigger.mockResolvedValue({ session: 'test' });
149
154
  await executeAfterWait(async () => {
150
155
  const payload = { newVizName: 'test' };
151
- expect(
152
- await searchEmbed.triggerUIPassThrough(
153
- UIPassthroughEvent.PinAnswerToLiveboard,
154
- payload,
155
- ),
156
+ await searchEmbed.triggerUIPassThrough(
157
+ UIPassthroughEvent.PinAnswerToLiveboard,
158
+ payload,
156
159
  );
157
160
  expect(mockProcessTrigger).toHaveBeenCalledWith(
158
161
  getIFrameEl(),
@@ -166,6 +169,26 @@ describe('Unit test case for ts embed', () => {
166
169
  });
167
170
  });
168
171
 
172
+ test('Host event with empty param', async () => {
173
+ const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
174
+ liveboardId: '123',
175
+ ...defaultViewConfig,
176
+ });
177
+ liveboardEmbed.render();
178
+ mockProcessTrigger.mockResolvedValue({ session: 'test' });
179
+ await executeAfterWait(async () => {
180
+ await liveboardEmbed.trigger(
181
+ HostEvent.Save,
182
+ );
183
+ expect(mockProcessTrigger).toHaveBeenCalledWith(
184
+ getIFrameEl(),
185
+ HostEvent.Save,
186
+ 'http://tshost',
187
+ {},
188
+ );
189
+ });
190
+ });
191
+
169
192
  test('should set proper height, width and min-height to iframe', async () => {
170
193
  // we dont have origin specific policies so just checking if
171
194
  // policies are ending with ;
@@ -227,6 +250,7 @@ describe('Unit test case for ts embed', () => {
227
250
  thoughtSpotHost: 'tshost',
228
251
  authType: AuthType.None,
229
252
  customizations: customisations,
253
+ customVariablesForThirdPartyTools,
230
254
  });
231
255
  });
232
256
 
@@ -244,18 +268,21 @@ describe('Unit test case for ts embed', () => {
244
268
  const iframe = getIFrameEl();
245
269
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
246
270
  });
247
- expect(mockPort.postMessage).toHaveBeenCalledWith({
248
- type: EmbedEvent.APP_INIT,
249
- data: {
250
- customisations,
251
- authToken: '',
252
- runtimeFilterParams: null,
253
- runtimeParameterParams: null,
254
- hiddenHomeLeftNavItems: [],
255
- hiddenHomepageModules: [],
256
- hostConfig: undefined,
257
- reorderedHomepageModules: [],
258
- },
271
+ await executeAfterWait(() => {
272
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
273
+ type: EmbedEvent.APP_INIT,
274
+ data: {
275
+ customisations,
276
+ authToken: '',
277
+ runtimeFilterParams: null,
278
+ runtimeParameterParams: null,
279
+ hiddenHomeLeftNavItems: [],
280
+ hiddenHomepageModules: [],
281
+ hostConfig: undefined,
282
+ reorderedHomepageModules: [],
283
+ customVariablesForThirdPartyTools,
284
+ },
285
+ });
259
286
  });
260
287
  });
261
288
 
@@ -276,18 +303,21 @@ describe('Unit test case for ts embed', () => {
276
303
  const iframe = getIFrameEl();
277
304
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
278
305
  });
279
- expect(mockPort.postMessage).toHaveBeenCalledWith({
280
- type: EmbedEvent.APP_INIT,
281
- data: {
282
- customisations: customisationsView,
283
- authToken: '',
284
- runtimeFilterParams: null,
285
- runtimeParameterParams: null,
286
- hiddenHomeLeftNavItems: [],
287
- hiddenHomepageModules: [],
288
- hostConfig: undefined,
289
- reorderedHomepageModules: [],
290
- },
306
+ await executeAfterWait(() => {
307
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
308
+ type: EmbedEvent.APP_INIT,
309
+ data: {
310
+ customisations: customisationsView,
311
+ authToken: '',
312
+ runtimeFilterParams: null,
313
+ runtimeParameterParams: null,
314
+ hiddenHomeLeftNavItems: [],
315
+ hiddenHomepageModules: [],
316
+ hostConfig: undefined,
317
+ reorderedHomepageModules: [],
318
+ customVariablesForThirdPartyTools,
319
+ },
320
+ });
291
321
  });
292
322
  });
293
323
 
@@ -313,18 +343,58 @@ describe('Unit test case for ts embed', () => {
313
343
  const iframe = getIFrameEl();
314
344
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
315
345
  });
316
- expect(mockPort.postMessage).toHaveBeenCalledWith({
346
+ await executeAfterWait(() => {
347
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
348
+ type: EmbedEvent.APP_INIT,
349
+ data: {
350
+ customisations,
351
+ authToken: '',
352
+ hostConfig: undefined,
353
+ runtimeFilterParams: null,
354
+ runtimeParameterParams: null,
355
+ hiddenHomeLeftNavItems: [],
356
+ hiddenHomepageModules: [HomepageModule.MyLibrary, HomepageModule.Learning],
357
+ reorderedHomepageModules: [],
358
+ customVariablesForThirdPartyTools,
359
+ },
360
+ });
361
+ });
362
+ });
363
+
364
+ test('customVariablesForThirdPartyTools should be part of the app_init payload', async () => {
365
+ const mockEmbedEventPayload = {
317
366
  type: EmbedEvent.APP_INIT,
318
- data: {
319
- customisations,
320
- authToken: '',
321
- hostConfig: undefined,
322
- runtimeFilterParams: null,
323
- runtimeParameterParams: null,
324
- hiddenHomeLeftNavItems: [],
325
- hiddenHomepageModules: [HomepageModule.MyLibrary, HomepageModule.Learning],
326
- reorderedHomepageModules: [],
327
- },
367
+ data: {},
368
+ };
369
+
370
+ const searchEmbed = new AppEmbed(getRootEl(), {
371
+ ...defaultViewConfig,
372
+ });
373
+ searchEmbed.render();
374
+
375
+ const mockPort: any = {
376
+ postMessage: jest.fn(),
377
+ };
378
+
379
+ await executeAfterWait(() => {
380
+ const iframe = getIFrameEl();
381
+ postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
382
+ });
383
+ await executeAfterWait(() => {
384
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
385
+ type: EmbedEvent.APP_INIT,
386
+ data: {
387
+ customisations,
388
+ authToken: '',
389
+ hostConfig: undefined,
390
+ runtimeFilterParams: null,
391
+ runtimeParameterParams: null,
392
+ hiddenHomeLeftNavItems: [],
393
+ hiddenHomepageModules: [],
394
+ reorderedHomepageModules: [],
395
+ customVariablesForThirdPartyTools,
396
+ },
397
+ });
328
398
  });
329
399
  });
330
400
 
@@ -350,18 +420,22 @@ describe('Unit test case for ts embed', () => {
350
420
  const iframe = getIFrameEl();
351
421
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
352
422
  });
353
- expect(mockPort.postMessage).toHaveBeenCalledWith({
354
- type: EmbedEvent.APP_INIT,
355
- data: {
356
- customisations,
357
- authToken: '',
358
- hostConfig: undefined,
359
- runtimeFilterParams: null,
360
- runtimeParameterParams: null,
361
- hiddenHomeLeftNavItems: [],
362
- hiddenHomepageModules: [],
363
- reorderedHomepageModules: [HomepageModule.MyLibrary, HomepageModule.Watchlist],
364
- },
423
+ await executeAfterWait(() => {
424
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
425
+ type: EmbedEvent.APP_INIT,
426
+ data: {
427
+ customisations,
428
+ authToken: '',
429
+ hostConfig: undefined,
430
+ runtimeFilterParams: null,
431
+ runtimeParameterParams: null,
432
+ hiddenHomeLeftNavItems: [],
433
+ hiddenHomepageModules: [],
434
+ reorderedHomepageModules:
435
+ [HomepageModule.MyLibrary, HomepageModule.Watchlist],
436
+ customVariablesForThirdPartyTools,
437
+ },
438
+ });
365
439
  });
366
440
  });
367
441
 
@@ -390,18 +464,21 @@ describe('Unit test case for ts embed', () => {
390
464
  const iframe = getIFrameEl();
391
465
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
392
466
  });
393
- expect(mockPort.postMessage).toHaveBeenCalledWith({
394
- type: EmbedEvent.APP_INIT,
395
- data: {
396
- customisations,
397
- authToken: '',
398
- runtimeFilterParams: null,
399
- runtimeParameterParams: 'param1=color&paramVal1=blue',
400
- hiddenHomeLeftNavItems: [],
401
- hiddenHomepageModules: [],
402
- hostConfig: undefined,
403
- reorderedHomepageModules: [],
404
- },
467
+ await executeAfterWait(() => {
468
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
469
+ type: EmbedEvent.APP_INIT,
470
+ data: {
471
+ customisations,
472
+ authToken: '',
473
+ runtimeFilterParams: null,
474
+ runtimeParameterParams: 'param1=color&paramVal1=blue',
475
+ hiddenHomeLeftNavItems: [],
476
+ hiddenHomepageModules: [],
477
+ hostConfig: undefined,
478
+ reorderedHomepageModules: [],
479
+ customVariablesForThirdPartyTools,
480
+ },
481
+ });
405
482
  });
406
483
  });
407
484
 
@@ -431,18 +508,21 @@ describe('Unit test case for ts embed', () => {
431
508
  const iframe = getIFrameEl();
432
509
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
433
510
  });
434
- expect(mockPort.postMessage).toHaveBeenCalledWith({
435
- type: EmbedEvent.APP_INIT,
436
- data: {
437
- customisations,
438
- authToken: '',
439
- runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
440
- runtimeParameterParams: null,
441
- hiddenHomeLeftNavItems: [],
442
- hiddenHomepageModules: [],
443
- hostConfig: undefined,
444
- reorderedHomepageModules: [],
445
- },
511
+ await executeAfterWait(() => {
512
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
513
+ type: EmbedEvent.APP_INIT,
514
+ data: {
515
+ customisations,
516
+ authToken: '',
517
+ runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
518
+ runtimeParameterParams: null,
519
+ hiddenHomeLeftNavItems: [],
520
+ hiddenHomepageModules: [],
521
+ hostConfig: undefined,
522
+ reorderedHomepageModules: [],
523
+ customVariablesForThirdPartyTools,
524
+ },
525
+ });
446
526
  });
447
527
  });
448
528
 
@@ -471,18 +551,21 @@ describe('Unit test case for ts embed', () => {
471
551
  const iframe = getIFrameEl();
472
552
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
473
553
  });
474
- expect(mockPort.postMessage).toHaveBeenCalledWith({
475
- type: EmbedEvent.APP_INIT,
476
- data: {
477
- customisations,
478
- authToken: '',
479
- runtimeFilterParams: null,
480
- runtimeParameterParams: null,
481
- hiddenHomeLeftNavItems: [],
482
- hiddenHomepageModules: [],
483
- hostConfig: undefined,
484
- reorderedHomepageModules: [],
485
- },
554
+ await executeAfterWait(() => {
555
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
556
+ type: EmbedEvent.APP_INIT,
557
+ data: {
558
+ customisations,
559
+ authToken: '',
560
+ runtimeFilterParams: null,
561
+ runtimeParameterParams: null,
562
+ hiddenHomeLeftNavItems: [],
563
+ hiddenHomepageModules: [],
564
+ hostConfig: undefined,
565
+ reorderedHomepageModules: [],
566
+ customVariablesForThirdPartyTools,
567
+ },
568
+ });
486
569
  });
487
570
  });
488
571
 
@@ -512,18 +595,21 @@ describe('Unit test case for ts embed', () => {
512
595
  const iframe = getIFrameEl();
513
596
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
514
597
  });
515
- expect(mockPort.postMessage).toHaveBeenCalledWith({
516
- type: EmbedEvent.APP_INIT,
517
- data: {
518
- customisations,
519
- authToken: '',
520
- runtimeFilterParams: null,
521
- runtimeParameterParams: null,
522
- hiddenHomeLeftNavItems: [],
523
- hiddenHomepageModules: [],
524
- hostConfig: undefined,
525
- reorderedHomepageModules: [],
526
- },
598
+ await executeAfterWait(() => {
599
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
600
+ type: EmbedEvent.APP_INIT,
601
+ data: {
602
+ customisations,
603
+ authToken: '',
604
+ runtimeFilterParams: null,
605
+ runtimeParameterParams: null,
606
+ hiddenHomeLeftNavItems: [],
607
+ hiddenHomepageModules: [],
608
+ hostConfig: undefined,
609
+ reorderedHomepageModules: [],
610
+ customVariablesForThirdPartyTools,
611
+ },
612
+ });
527
613
  });
528
614
  });
529
615
 
@@ -549,19 +635,23 @@ describe('Unit test case for ts embed', () => {
549
635
  const iframe = getIFrameEl();
550
636
  postMessageToParent(iframe.contentWindow, mockEmbedEventPayload, mockPort);
551
637
  });
552
- expect(mockPort.postMessage).toHaveBeenCalledWith({
553
- type: EmbedEvent.APP_INIT,
554
- data: {
555
- customisations,
556
- authToken: '',
557
- hostConfig: undefined,
558
- runtimeFilterParams: null,
559
- runtimeParameterParams: null,
560
- hiddenHomeLeftNavItems:
561
- [HomeLeftNavItem.Home, HomeLeftNavItem.MonitorSubscription],
562
- hiddenHomepageModules: [],
563
- reorderedHomepageModules: [],
564
- },
638
+
639
+ await executeAfterWait(() => {
640
+ expect(mockPort.postMessage).toHaveBeenCalledWith({
641
+ type: EmbedEvent.APP_INIT,
642
+ data: {
643
+ customisations,
644
+ authToken: '',
645
+ hostConfig: undefined,
646
+ runtimeFilterParams: null,
647
+ runtimeParameterParams: null,
648
+ hiddenHomeLeftNavItems:
649
+ [HomeLeftNavItem.Home, HomeLeftNavItem.MonitorSubscription],
650
+ hiddenHomepageModules: [],
651
+ reorderedHomepageModules: [],
652
+ customVariablesForThirdPartyTools,
653
+ },
654
+ });
565
655
  });
566
656
  });
567
657
 
@@ -727,6 +817,7 @@ describe('Unit test case for ts embed', () => {
727
817
  hiddenHomepageModules: [],
728
818
  hostConfig: undefined,
729
819
  reorderedHomepageModules: [],
820
+ customVariablesForThirdPartyTools: {},
730
821
  },
731
822
  });
732
823
  });
@@ -744,6 +835,7 @@ describe('Unit test case for ts embed', () => {
744
835
  authType: AuthType.TrustedAuthTokenCookieless,
745
836
  getAuthToken: () => Promise.reject(),
746
837
  });
838
+ jest.spyOn(logger, 'error').mockResolvedValue(true);
747
839
  });
748
840
 
749
841
  afterEach(() => {
@@ -60,6 +60,7 @@ import {
60
60
  FrameParams,
61
61
  ContextMenuTriggerOptions,
62
62
  RuntimeFilter,
63
+ DefaultAppInitData,
63
64
  } from '../types';
64
65
  import { uploadMixpanelEvent, MIXPANEL_EVENT } from '../mixpanel-service';
65
66
  import { processEventData, processAuthFailure } from '../utils/processData';
@@ -319,41 +320,62 @@ export class TsEmbed {
319
320
  });
320
321
  }
321
322
 
323
+ protected async getAuthTokenForCookielessInit() {
324
+ let authToken = '';
325
+ if (this.embedConfig.authType !== AuthType.TrustedAuthTokenCookieless) return authToken;
326
+
327
+ try {
328
+ authToken = await getAuthenticationToken(this.embedConfig);
329
+ } catch (e) {
330
+ processAuthFailure(e, this.isPreRendered ? this.preRenderWrapper : this.el);
331
+ throw e;
332
+ }
333
+
334
+ return authToken;
335
+ }
336
+
337
+ protected async getDefaultAppInitData(): Promise<DefaultAppInitData> {
338
+ const authToken = await this.getAuthTokenForCookielessInit();
339
+ return {
340
+ customisations: getCustomisations(this.embedConfig, this.viewConfig),
341
+ authToken,
342
+ runtimeFilterParams: this.viewConfig.excludeRuntimeFiltersfromURL
343
+ ? getRuntimeFilters(this.viewConfig.runtimeFilters)
344
+ : null,
345
+ runtimeParameterParams: this.viewConfig.excludeRuntimeParametersfromURL
346
+ ? getRuntimeParameters(this.viewConfig.runtimeParameters || [])
347
+ : null,
348
+ hiddenHomepageModules: this.viewConfig.hiddenHomepageModules || [],
349
+ reorderedHomepageModules: this.viewConfig.reorderedHomepageModules || [],
350
+ hostConfig: this.embedConfig.hostConfig,
351
+ hiddenHomeLeftNavItems: this.viewConfig?.hiddenHomeLeftNavItems
352
+ ? this.viewConfig?.hiddenHomeLeftNavItems
353
+ : [],
354
+ customVariablesForThirdPartyTools:
355
+ this.embedConfig.customVariablesForThirdPartyTools || {},
356
+ };
357
+ }
358
+
359
+ protected async getAppInitData() {
360
+ return this.getDefaultAppInitData();
361
+ }
362
+
322
363
  /**
323
364
  * Send Custom style as part of payload of APP_INIT
324
365
  * @param _
325
366
  * @param responder
326
367
  */
327
368
  private appInitCb = async (_: any, responder: any) => {
328
- let authToken = '';
329
- if (this.embedConfig.authType === AuthType.TrustedAuthTokenCookieless) {
330
- try {
331
- authToken = await getAuthenticationToken(this.embedConfig);
332
- } catch (e) {
333
- processAuthFailure(e, this.isPreRendered ? this.preRenderWrapper : this.el);
334
- return;
335
- }
369
+ try {
370
+ const appInitData = await this.getAppInitData();
371
+ this.isAppInitialized = true;
372
+ responder({
373
+ type: EmbedEvent.APP_INIT,
374
+ data: appInitData,
375
+ });
376
+ } catch (e) {
377
+ logger.error(`AppInit failed, Error : ${e?.message}`);
336
378
  }
337
- this.isAppInitialized = true;
338
- responder({
339
- type: EmbedEvent.APP_INIT,
340
- data: {
341
- customisations: getCustomisations(this.embedConfig, this.viewConfig),
342
- authToken,
343
- runtimeFilterParams: this.viewConfig.excludeRuntimeFiltersfromURL
344
- ? getRuntimeFilters(this.viewConfig.runtimeFilters)
345
- : null,
346
- runtimeParameterParams: this.viewConfig.excludeRuntimeParametersfromURL
347
- ? getRuntimeParameters(this.viewConfig.runtimeParameters || [])
348
- : null,
349
- hiddenHomepageModules: this.viewConfig.hiddenHomepageModules || [],
350
- reorderedHomepageModules: this.viewConfig.reorderedHomepageModules || [],
351
- hostConfig: this.embedConfig.hostConfig,
352
- hiddenHomeLeftNavItems: this.viewConfig?.hiddenHomeLeftNavItems
353
- ? this.viewConfig?.hiddenHomeLeftNavItems
354
- : [],
355
- },
356
- });
357
379
  };
358
380
 
359
381
  /**
@@ -1024,8 +1046,8 @@ export class TsEmbed {
1024
1046
  this.handleError('Host event type is undefined');
1025
1047
  return null;
1026
1048
  }
1027
-
1028
- return this.hostEventClient.triggerHostEvent(messageType, data);
1049
+ // send an empty object, this is needed for liveboard default handlers
1050
+ return this.hostEventClient.triggerHostEvent(messageType, data || {});
1029
1051
  }
1030
1052
 
1031
1053
  /**
package/src/types.ts CHANGED
@@ -608,6 +608,22 @@ export interface EmbedConfig {
608
608
  * @version SDK: 1.33.5 | ThoughtSpot: *
609
609
  */
610
610
  additionalFlags?: { [key: string]: string | number | boolean };
611
+ /**
612
+ * This is an object (key/val) for customVariables being
613
+ * used by the third party tool's script.
614
+ * @example
615
+ * ```js
616
+ * const embed = new LiveboardEmbed('#embed', {
617
+ * ... // other liveboard view config
618
+ * customVariablesForThirdPartyTools: {
619
+ * key1: 'value1',
620
+ * key2: 'value2'
621
+ * }
622
+ * });
623
+ * ```
624
+ * @version SDK 1.37.0 | Thoughtspot: 10.7.0.cl
625
+ */
626
+ customVariablesForThirdPartyTools?: Record< string, any >;
611
627
  }
612
628
 
613
629
  // eslint-disable-next-line @typescript-eslint/no-empty-interface
@@ -4608,3 +4624,15 @@ export enum LogLevel {
4608
4624
  */
4609
4625
  TRACE = 'TRACE',
4610
4626
  }
4627
+
4628
+ export interface DefaultAppInitData {
4629
+ customisations: CustomisationsInterface;
4630
+ authToken: string;
4631
+ runtimeFilterParams: string | null;
4632
+ runtimeParameterParams: string | null;
4633
+ hiddenHomepageModules: HomepageModule[];
4634
+ reorderedHomepageModules: string[];
4635
+ hostConfig: Record<string, any>;
4636
+ hiddenHomeLeftNavItems: string[];
4637
+ customVariablesForThirdPartyTools: Record<string, any>;
4638
+ }