@thoughtspot/visual-embed-sdk 1.43.0 → 1.43.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 (178) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/api-intercept.d.ts +51 -0
  3. package/cjs/src/api-intercept.d.ts.map +1 -0
  4. package/cjs/src/api-intercept.js +180 -0
  5. package/cjs/src/api-intercept.js.map +1 -0
  6. package/cjs/src/api-intercept.spec.d.ts +2 -0
  7. package/cjs/src/api-intercept.spec.d.ts.map +1 -0
  8. package/cjs/src/api-intercept.spec.js +672 -0
  9. package/cjs/src/api-intercept.spec.js.map +1 -0
  10. package/cjs/src/css-variables.d.ts +4 -0
  11. package/cjs/src/css-variables.d.ts.map +1 -1
  12. package/cjs/src/embed/app.d.ts +0 -5
  13. package/cjs/src/embed/app.d.ts.map +1 -1
  14. package/cjs/src/embed/app.js +4 -5
  15. package/cjs/src/embed/app.js.map +1 -1
  16. package/cjs/src/embed/app.spec.js +10 -0
  17. package/cjs/src/embed/app.spec.js.map +1 -1
  18. package/cjs/src/embed/conversation.d.ts +2 -2
  19. package/cjs/src/embed/conversation.js +1 -1
  20. package/cjs/src/embed/conversation.js.map +1 -1
  21. package/cjs/src/embed/conversation.spec.js +17 -0
  22. package/cjs/src/embed/conversation.spec.js.map +1 -1
  23. package/cjs/src/embed/hostEventClient/contracts.d.ts +11 -1
  24. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  25. package/cjs/src/embed/hostEventClient/contracts.js +1 -0
  26. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  27. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  28. package/cjs/src/embed/liveboard.js +4 -2
  29. package/cjs/src/embed/liveboard.js.map +1 -1
  30. package/cjs/src/embed/liveboard.spec.js +11 -0
  31. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  32. package/cjs/src/embed/search.d.ts +0 -7
  33. package/cjs/src/embed/search.d.ts.map +1 -1
  34. package/cjs/src/embed/search.js +1 -4
  35. package/cjs/src/embed/search.js.map +1 -1
  36. package/cjs/src/embed/ts-embed.d.ts +10 -0
  37. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  38. package/cjs/src/embed/ts-embed.js +56 -15
  39. package/cjs/src/embed/ts-embed.js.map +1 -1
  40. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  41. package/cjs/src/embed/ts-embed.spec.js +412 -238
  42. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  43. package/cjs/src/index.d.ts +2 -2
  44. package/cjs/src/index.d.ts.map +1 -1
  45. package/cjs/src/index.js +2 -1
  46. package/cjs/src/index.js.map +1 -1
  47. package/cjs/src/react/all-types-export.d.ts +1 -1
  48. package/cjs/src/react/all-types-export.d.ts.map +1 -1
  49. package/cjs/src/react/all-types-export.js +2 -1
  50. package/cjs/src/react/all-types-export.js.map +1 -1
  51. package/cjs/src/types.d.ts +244 -88
  52. package/cjs/src/types.d.ts.map +1 -1
  53. package/cjs/src/types.js +181 -70
  54. package/cjs/src/types.js.map +1 -1
  55. package/cjs/src/utils/logger.d.ts.map +1 -1
  56. package/cjs/src/utils/logger.js +1 -2
  57. package/cjs/src/utils/logger.js.map +1 -1
  58. package/cjs/src/utils/processData.d.ts +1 -1
  59. package/cjs/src/utils/processData.d.ts.map +1 -1
  60. package/cjs/src/utils/processData.js +8 -8
  61. package/cjs/src/utils/processData.js.map +1 -1
  62. package/cjs/src/utils/processData.spec.js.map +1 -1
  63. package/dist/{index-HZ94j9Ey.js → index-CpkMygsc.js} +1 -1
  64. package/dist/src/api-intercept.d.ts +51 -0
  65. package/dist/src/api-intercept.d.ts.map +1 -0
  66. package/dist/src/api-intercept.spec.d.ts +2 -0
  67. package/dist/src/api-intercept.spec.d.ts.map +1 -0
  68. package/dist/src/css-variables.d.ts +4 -0
  69. package/dist/src/css-variables.d.ts.map +1 -1
  70. package/dist/src/embed/app.d.ts +0 -5
  71. package/dist/src/embed/app.d.ts.map +1 -1
  72. package/dist/src/embed/conversation.d.ts +2 -2
  73. package/dist/src/embed/hostEventClient/contracts.d.ts +11 -1
  74. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  75. package/dist/src/embed/liveboard.d.ts.map +1 -1
  76. package/dist/src/embed/search.d.ts +0 -7
  77. package/dist/src/embed/search.d.ts.map +1 -1
  78. package/dist/src/embed/ts-embed.d.ts +10 -0
  79. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  80. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  81. package/dist/src/index.d.ts +2 -2
  82. package/dist/src/index.d.ts.map +1 -1
  83. package/dist/src/react/all-types-export.d.ts +1 -1
  84. package/dist/src/react/all-types-export.d.ts.map +1 -1
  85. package/dist/src/types.d.ts +244 -88
  86. package/dist/src/types.d.ts.map +1 -1
  87. package/dist/src/utils/logger.d.ts.map +1 -1
  88. package/dist/src/utils/processData.d.ts +1 -1
  89. package/dist/src/utils/processData.d.ts.map +1 -1
  90. package/dist/tsembed-react.es.js +435 -118
  91. package/dist/tsembed-react.js +434 -117
  92. package/dist/tsembed.es.js +3577 -3260
  93. package/dist/tsembed.js +3575 -3258
  94. package/dist/visual-embed-sdk-react-full.d.ts +271 -103
  95. package/dist/visual-embed-sdk-react.d.ts +268 -103
  96. package/dist/visual-embed-sdk.d.ts +271 -103
  97. package/lib/package.json +1 -1
  98. package/lib/src/api-intercept.d.ts +51 -0
  99. package/lib/src/api-intercept.d.ts.map +1 -0
  100. package/lib/src/api-intercept.js +173 -0
  101. package/lib/src/api-intercept.js.map +1 -0
  102. package/lib/src/api-intercept.spec.d.ts +2 -0
  103. package/lib/src/api-intercept.spec.d.ts.map +1 -0
  104. package/lib/src/api-intercept.spec.js +669 -0
  105. package/lib/src/api-intercept.spec.js.map +1 -0
  106. package/lib/src/css-variables.d.ts +4 -0
  107. package/lib/src/css-variables.d.ts.map +1 -1
  108. package/lib/src/embed/app.d.ts +0 -5
  109. package/lib/src/embed/app.d.ts.map +1 -1
  110. package/lib/src/embed/app.js +4 -5
  111. package/lib/src/embed/app.js.map +1 -1
  112. package/lib/src/embed/app.spec.js +10 -0
  113. package/lib/src/embed/app.spec.js.map +1 -1
  114. package/lib/src/embed/conversation.d.ts +2 -2
  115. package/lib/src/embed/conversation.js +1 -1
  116. package/lib/src/embed/conversation.js.map +1 -1
  117. package/lib/src/embed/conversation.spec.js +17 -0
  118. package/lib/src/embed/conversation.spec.js.map +1 -1
  119. package/lib/src/embed/hostEventClient/contracts.d.ts +11 -1
  120. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  121. package/lib/src/embed/hostEventClient/contracts.js +1 -0
  122. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  123. package/lib/src/embed/liveboard.d.ts.map +1 -1
  124. package/lib/src/embed/liveboard.js +4 -2
  125. package/lib/src/embed/liveboard.js.map +1 -1
  126. package/lib/src/embed/liveboard.spec.js +11 -0
  127. package/lib/src/embed/liveboard.spec.js.map +1 -1
  128. package/lib/src/embed/search.d.ts +0 -7
  129. package/lib/src/embed/search.d.ts.map +1 -1
  130. package/lib/src/embed/search.js +1 -4
  131. package/lib/src/embed/search.js.map +1 -1
  132. package/lib/src/embed/ts-embed.d.ts +10 -0
  133. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  134. package/lib/src/embed/ts-embed.js +56 -15
  135. package/lib/src/embed/ts-embed.js.map +1 -1
  136. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  137. package/lib/src/embed/ts-embed.spec.js +412 -238
  138. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  139. package/lib/src/index.d.ts +2 -2
  140. package/lib/src/index.d.ts.map +1 -1
  141. package/lib/src/index.js +2 -2
  142. package/lib/src/index.js.map +1 -1
  143. package/lib/src/react/all-types-export.d.ts +1 -1
  144. package/lib/src/react/all-types-export.d.ts.map +1 -1
  145. package/lib/src/react/all-types-export.js +1 -1
  146. package/lib/src/react/all-types-export.js.map +1 -1
  147. package/lib/src/types.d.ts +244 -88
  148. package/lib/src/types.d.ts.map +1 -1
  149. package/lib/src/types.js +180 -69
  150. package/lib/src/types.js.map +1 -1
  151. package/lib/src/utils/logger.d.ts.map +1 -1
  152. package/lib/src/utils/logger.js +1 -2
  153. package/lib/src/utils/logger.js.map +1 -1
  154. package/lib/src/utils/processData.d.ts +1 -1
  155. package/lib/src/utils/processData.d.ts.map +1 -1
  156. package/lib/src/utils/processData.js +8 -8
  157. package/lib/src/utils/processData.js.map +1 -1
  158. package/lib/src/utils/processData.spec.js.map +1 -1
  159. package/package.json +1 -1
  160. package/src/api-intercept.spec.ts +856 -0
  161. package/src/api-intercept.ts +204 -0
  162. package/src/css-variables.ts +5 -0
  163. package/src/embed/app.spec.ts +11 -0
  164. package/src/embed/app.ts +5 -16
  165. package/src/embed/conversation.spec.ts +22 -0
  166. package/src/embed/conversation.ts +3 -3
  167. package/src/embed/hostEventClient/contracts.ts +10 -0
  168. package/src/embed/liveboard.spec.ts +12 -0
  169. package/src/embed/liveboard.ts +6 -2
  170. package/src/embed/search.ts +1 -14
  171. package/src/embed/ts-embed.spec.ts +498 -250
  172. package/src/embed/ts-embed.ts +80 -32
  173. package/src/index.ts +2 -0
  174. package/src/react/all-types-export.ts +1 -0
  175. package/src/types.ts +327 -165
  176. package/src/utils/logger.ts +1 -2
  177. package/src/utils/processData.spec.ts +0 -1
  178. package/src/utils/processData.ts +10 -11
@@ -23,8 +23,10 @@ const processTrigger_1 = require("../utils/processTrigger");
23
23
  const contracts_1 = require("./hostEventClient/contracts");
24
24
  const sessionInfoService = tslib_1.__importStar(require("../utils/sessionInfoService"));
25
25
  const authToken = tslib_1.__importStar(require("../authToken"));
26
+ const apiIntercept = tslib_1.__importStar(require("../api-intercept"));
26
27
  jest.mock('../utils/processTrigger');
27
28
  const mockProcessTrigger = processTrigger_1.processTrigger;
29
+ const mockHandleInterceptEvent = jest.spyOn(apiIntercept, 'handleInterceptEvent');
28
30
  const defaultViewConfig = {
29
31
  frameParams: {
30
32
  width: 1280,
@@ -64,6 +66,30 @@ const customVariablesForThirdPartyTools = {
64
66
  key1: '!@#',
65
67
  key2: '*%^',
66
68
  };
69
+ const getMockAppInitPayload = (data) => {
70
+ const defaultData = {
71
+ customisations,
72
+ authToken: '',
73
+ hostConfig: undefined,
74
+ runtimeFilterParams: null,
75
+ runtimeParameterParams: null,
76
+ hiddenHomeLeftNavItems: [],
77
+ hiddenHomepageModules: [],
78
+ hiddenListColumns: [],
79
+ customActions: [],
80
+ reorderedHomepageModules: [],
81
+ customVariablesForThirdPartyTools,
82
+ interceptTimeout: undefined,
83
+ interceptUrls: [],
84
+ };
85
+ return {
86
+ type: index_1.EmbedEvent.APP_INIT,
87
+ data: {
88
+ ...defaultData,
89
+ ...data,
90
+ },
91
+ };
92
+ };
67
93
  describe('Unit test case for ts embed', () => {
68
94
  const mockMixPanelEvent = jest.spyOn(mixpanelInstance, 'uploadMixpanelEvent');
69
95
  beforeEach(() => {
@@ -247,22 +273,7 @@ describe('Unit test case for ts embed', () => {
247
273
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
248
274
  });
249
275
  await (0, test_utils_1.executeAfterWait)(() => {
250
- expect(mockPort.postMessage).toHaveBeenCalledWith({
251
- type: index_1.EmbedEvent.APP_INIT,
252
- data: {
253
- customisations,
254
- authToken: '',
255
- runtimeFilterParams: null,
256
- runtimeParameterParams: null,
257
- hiddenHomeLeftNavItems: [],
258
- hiddenHomepageModules: [],
259
- hiddenListColumns: [],
260
- customActions: [],
261
- hostConfig: undefined,
262
- reorderedHomepageModules: [],
263
- customVariablesForThirdPartyTools,
264
- },
265
- });
276
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({}));
266
277
  });
267
278
  });
268
279
  test('verify Customisations from viewConfig', async () => {
@@ -283,22 +294,9 @@ describe('Unit test case for ts embed', () => {
283
294
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
284
295
  });
285
296
  await (0, test_utils_1.executeAfterWait)(() => {
286
- expect(mockPort.postMessage).toHaveBeenCalledWith({
287
- type: index_1.EmbedEvent.APP_INIT,
288
- data: {
289
- customisations: customisationsView,
290
- authToken: '',
291
- runtimeFilterParams: null,
292
- runtimeParameterParams: null,
293
- hiddenHomeLeftNavItems: [],
294
- hiddenHomepageModules: [],
295
- hiddenListColumns: [],
296
- customActions: [],
297
- hostConfig: undefined,
298
- reorderedHomepageModules: [],
299
- customVariablesForThirdPartyTools,
300
- },
301
- });
297
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
298
+ customisations: customisationsView,
299
+ }));
302
300
  });
303
301
  });
304
302
  test('hide home page modules from view Config should be part of app_init payload', async () => {
@@ -323,22 +321,9 @@ describe('Unit test case for ts embed', () => {
323
321
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
324
322
  });
325
323
  await (0, test_utils_1.executeAfterWait)(() => {
326
- expect(mockPort.postMessage).toHaveBeenCalledWith({
327
- type: index_1.EmbedEvent.APP_INIT,
328
- data: {
329
- customisations,
330
- authToken: '',
331
- hostConfig: undefined,
332
- runtimeFilterParams: null,
333
- runtimeParameterParams: null,
334
- hiddenHomeLeftNavItems: [],
335
- hiddenHomepageModules: [types_1.HomepageModule.MyLibrary, types_1.HomepageModule.Learning],
336
- hiddenListColumns: [],
337
- customActions: [],
338
- reorderedHomepageModules: [],
339
- customVariablesForThirdPartyTools,
340
- },
341
- });
324
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
325
+ hiddenHomepageModules: [types_1.HomepageModule.MyLibrary, types_1.HomepageModule.Learning],
326
+ }));
342
327
  });
343
328
  });
344
329
  test('customVariablesForThirdPartyTools should be part of the app_init payload', async () => {
@@ -358,22 +343,7 @@ describe('Unit test case for ts embed', () => {
358
343
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
359
344
  });
360
345
  await (0, test_utils_1.executeAfterWait)(() => {
361
- expect(mockPort.postMessage).toHaveBeenCalledWith({
362
- type: index_1.EmbedEvent.APP_INIT,
363
- data: {
364
- customisations,
365
- authToken: '',
366
- hostConfig: undefined,
367
- runtimeFilterParams: null,
368
- runtimeParameterParams: null,
369
- hiddenHomeLeftNavItems: [],
370
- hiddenHomepageModules: [],
371
- hiddenListColumns: [],
372
- customActions: [],
373
- reorderedHomepageModules: [],
374
- customVariablesForThirdPartyTools,
375
- },
376
- });
346
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({}));
377
347
  });
378
348
  });
379
349
  test('Reordering the home page modules from view Config should be part of app_init payload', async () => {
@@ -398,22 +368,9 @@ describe('Unit test case for ts embed', () => {
398
368
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
399
369
  });
400
370
  await (0, test_utils_1.executeAfterWait)(() => {
401
- expect(mockPort.postMessage).toHaveBeenCalledWith({
402
- type: index_1.EmbedEvent.APP_INIT,
403
- data: {
404
- customisations,
405
- authToken: '',
406
- hostConfig: undefined,
407
- runtimeFilterParams: null,
408
- runtimeParameterParams: null,
409
- hiddenHomeLeftNavItems: [],
410
- hiddenHomepageModules: [],
411
- hiddenListColumns: [],
412
- customActions: [],
413
- reorderedHomepageModules: [types_1.HomepageModule.MyLibrary, types_1.HomepageModule.Watchlist],
414
- customVariablesForThirdPartyTools,
415
- },
416
- });
371
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
372
+ reorderedHomepageModules: [types_1.HomepageModule.MyLibrary, types_1.HomepageModule.Watchlist],
373
+ }));
417
374
  });
418
375
  });
419
376
  test('Runtime parameters from view Config should be part of app_init payload when excludeRuntimeParametsfromURL is true', async () => {
@@ -441,22 +398,9 @@ describe('Unit test case for ts embed', () => {
441
398
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
442
399
  });
443
400
  await (0, test_utils_1.executeAfterWait)(() => {
444
- expect(mockPort.postMessage).toHaveBeenCalledWith({
445
- type: index_1.EmbedEvent.APP_INIT,
446
- data: {
447
- customisations,
448
- authToken: '',
449
- runtimeFilterParams: null,
450
- runtimeParameterParams: 'param1=color&paramVal1=blue',
451
- hiddenHomeLeftNavItems: [],
452
- hiddenHomepageModules: [],
453
- hiddenListColumns: [],
454
- customActions: [],
455
- hostConfig: undefined,
456
- reorderedHomepageModules: [],
457
- customVariablesForThirdPartyTools,
458
- },
459
- });
401
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
402
+ runtimeParameterParams: 'param1=color&paramVal1=blue',
403
+ }));
460
404
  });
461
405
  });
462
406
  test('Runtime filters from view Config should be part of app_init payload when excludeRuntimeFiltersfromURL is true', async () => {
@@ -485,22 +429,9 @@ describe('Unit test case for ts embed', () => {
485
429
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
486
430
  });
487
431
  await (0, test_utils_1.executeAfterWait)(() => {
488
- expect(mockPort.postMessage).toHaveBeenCalledWith({
489
- type: index_1.EmbedEvent.APP_INIT,
490
- data: {
491
- customisations,
492
- authToken: '',
493
- runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
494
- runtimeParameterParams: null,
495
- hiddenHomeLeftNavItems: [],
496
- hiddenHomepageModules: [],
497
- hiddenListColumns: [],
498
- customActions: [],
499
- hostConfig: undefined,
500
- reorderedHomepageModules: [],
501
- customVariablesForThirdPartyTools,
502
- },
503
- });
432
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
433
+ runtimeFilterParams: 'col1=color&op1=EQ&val1=blue',
434
+ }));
504
435
  });
505
436
  });
506
437
  test('Runtime filters from view Config should be not part of app_init payload when excludeRuntimeFiltersfromURL is undefined', async () => {
@@ -528,22 +459,7 @@ describe('Unit test case for ts embed', () => {
528
459
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
529
460
  });
530
461
  await (0, test_utils_1.executeAfterWait)(() => {
531
- expect(mockPort.postMessage).toHaveBeenCalledWith({
532
- type: index_1.EmbedEvent.APP_INIT,
533
- data: {
534
- customisations,
535
- authToken: '',
536
- runtimeFilterParams: null,
537
- runtimeParameterParams: null,
538
- hiddenHomeLeftNavItems: [],
539
- hiddenHomepageModules: [],
540
- hiddenListColumns: [],
541
- customActions: [],
542
- hostConfig: undefined,
543
- reorderedHomepageModules: [],
544
- customVariablesForThirdPartyTools,
545
- },
546
- });
462
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({}));
547
463
  });
548
464
  });
549
465
  test('Runtime filters from view Config should not be part of app_init payload when excludeRuntimeFiltersfromURL is false', async () => {
@@ -572,22 +488,7 @@ describe('Unit test case for ts embed', () => {
572
488
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
573
489
  });
574
490
  await (0, test_utils_1.executeAfterWait)(() => {
575
- expect(mockPort.postMessage).toHaveBeenCalledWith({
576
- type: index_1.EmbedEvent.APP_INIT,
577
- data: {
578
- customisations,
579
- authToken: '',
580
- runtimeFilterParams: null,
581
- runtimeParameterParams: null,
582
- hiddenHomeLeftNavItems: [],
583
- hiddenHomepageModules: [],
584
- hiddenListColumns: [],
585
- customActions: [],
586
- hostConfig: undefined,
587
- reorderedHomepageModules: [],
588
- customVariablesForThirdPartyTools,
589
- },
590
- });
491
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({}));
591
492
  });
592
493
  });
593
494
  test('homeLeftNav from view Config should be part of app_init payload', async () => {
@@ -612,22 +513,9 @@ describe('Unit test case for ts embed', () => {
612
513
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
613
514
  });
614
515
  await (0, test_utils_1.executeAfterWait)(() => {
615
- expect(mockPort.postMessage).toHaveBeenCalledWith({
616
- type: index_1.EmbedEvent.APP_INIT,
617
- data: {
618
- customisations,
619
- authToken: '',
620
- hostConfig: undefined,
621
- runtimeFilterParams: null,
622
- runtimeParameterParams: null,
623
- hiddenHomeLeftNavItems: [types_1.HomeLeftNavItem.Home, types_1.HomeLeftNavItem.MonitorSubscription],
624
- hiddenHomepageModules: [],
625
- hiddenListColumns: [],
626
- customActions: [],
627
- reorderedHomepageModules: [],
628
- customVariablesForThirdPartyTools,
629
- },
630
- });
516
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
517
+ hiddenHomeLeftNavItems: [types_1.HomeLeftNavItem.Home, types_1.HomeLeftNavItem.MonitorSubscription],
518
+ }));
631
519
  });
632
520
  });
633
521
  test('when Embed event status have start status', (done) => {
@@ -759,22 +647,10 @@ describe('Unit test case for ts embed', () => {
759
647
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
760
648
  });
761
649
  await (0, test_utils_1.executeAfterWait)(() => {
762
- expect(mockPort.postMessage).toHaveBeenCalledWith({
763
- type: index_1.EmbedEvent.APP_INIT,
764
- data: {
765
- customisations,
766
- authToken: 'test_auth_token1',
767
- runtimeFilterParams: null,
768
- runtimeParameterParams: null,
769
- hiddenHomeLeftNavItems: [],
770
- hiddenHomepageModules: [],
771
- hiddenListColumns: [],
772
- customActions: [],
773
- hostConfig: undefined,
774
- reorderedHomepageModules: [],
775
- customVariablesForThirdPartyTools: {},
776
- },
777
- });
650
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
651
+ authToken: 'test_auth_token1',
652
+ customVariablesForThirdPartyTools: {},
653
+ }));
778
654
  });
779
655
  jest.spyOn(authService, 'verifyTokenService').mockClear();
780
656
  });
@@ -824,36 +700,25 @@ describe('Unit test case for ts embed', () => {
824
700
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
825
701
  });
826
702
  await (0, test_utils_1.executeAfterWait)(() => {
827
- expect(mockPort.postMessage).toHaveBeenCalledWith({
828
- type: index_1.EmbedEvent.APP_INIT,
829
- data: {
830
- customisations: {
831
- content: {
832
- strings: {
833
- Liveboard: 'Dashboard',
834
- },
835
- stringIDsUrl: 'https://sample-string-ids-url.com',
836
- stringIDs: {
837
- 'liveboard.header.title': 'Dashboard name',
838
- },
703
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
704
+ customisations: {
705
+ content: {
706
+ strings: {
707
+ Liveboard: 'Dashboard',
839
708
  },
840
- style: {
841
- customCSS: {},
842
- customCSSUrl: undefined,
709
+ stringIDsUrl: 'https://sample-string-ids-url.com',
710
+ stringIDs: {
711
+ 'liveboard.header.title': 'Dashboard name',
843
712
  },
844
713
  },
845
- authToken: 'test_auth_token1',
846
- runtimeFilterParams: null,
847
- runtimeParameterParams: null,
848
- hiddenHomeLeftNavItems: [],
849
- hiddenHomepageModules: [],
850
- hiddenListColumns: [],
851
- customActions: [],
852
- hostConfig: undefined,
853
- reorderedHomepageModules: [],
854
- customVariablesForThirdPartyTools: {},
714
+ style: {
715
+ customCSS: {},
716
+ customCSSUrl: undefined,
717
+ },
855
718
  },
856
- });
719
+ authToken: 'test_auth_token1',
720
+ customVariablesForThirdPartyTools: {},
721
+ }));
857
722
  const customisationContent = mockPort.postMessage.mock.calls[0][0].data.customisations.content;
858
723
  expect(customisationContent.stringIDsUrl)
859
724
  .toBe('https://sample-string-ids-url.com');
@@ -929,43 +794,33 @@ describe('Unit test case for ts embed', () => {
929
794
  (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEmbedEventPayload, mockPort);
930
795
  });
931
796
  await (0, test_utils_1.executeAfterWait)(() => {
932
- expect(mockPort.postMessage).toHaveBeenCalledWith({
933
- type: index_1.EmbedEvent.APP_INIT,
934
- data: {
935
- customisations: {
936
- content: {},
937
- style: {
938
- customCSS: {},
939
- customCSSUrl: undefined,
940
- },
797
+ expect(mockPort.postMessage).toHaveBeenCalledWith(getMockAppInitPayload({
798
+ customisations: {
799
+ content: {},
800
+ style: {
801
+ customCSS: {},
802
+ customCSSUrl: undefined,
941
803
  },
942
- authToken: 'test_auth_token1',
943
- runtimeFilterParams: null,
944
- runtimeParameterParams: null,
945
- hiddenHomeLeftNavItems: [],
946
- hiddenHomepageModules: [],
947
- hiddenListColumns: [],
948
- customActions: [
949
- {
950
- id: 'action2',
951
- name: 'Another Valid Action',
952
- target: types_1.CustomActionTarget.VIZ,
953
- position: types_1.CustomActionsPosition.MENU,
954
- metadataIds: { vizIds: ['viz456'] }
955
- },
956
- {
957
- id: 'action1',
958
- name: 'Valid Action',
959
- target: types_1.CustomActionTarget.LIVEBOARD,
960
- position: types_1.CustomActionsPosition.PRIMARY,
961
- metadataIds: { liveboardIds: ['lb123'] }
962
- }
963
- ],
964
- hostConfig: undefined,
965
- reorderedHomepageModules: [],
966
- customVariablesForThirdPartyTools: {},
967
804
  },
968
- });
805
+ authToken: 'test_auth_token1',
806
+ customActions: [
807
+ {
808
+ id: 'action2',
809
+ name: 'Another Valid Action',
810
+ target: types_1.CustomActionTarget.VIZ,
811
+ position: types_1.CustomActionsPosition.MENU,
812
+ metadataIds: { vizIds: ['viz456'] }
813
+ },
814
+ {
815
+ id: 'action1',
816
+ name: 'Valid Action',
817
+ target: types_1.CustomActionTarget.LIVEBOARD,
818
+ position: types_1.CustomActionsPosition.PRIMARY,
819
+ metadataIds: { liveboardIds: ['lb123'] }
820
+ }
821
+ ],
822
+ customVariablesForThirdPartyTools: {},
823
+ }));
969
824
  // Verify that CustomActionsValidationResult structure is
970
825
  // correct
971
826
  const appInitData = mockPort.postMessage.mock.calls[0][0].data;
@@ -2909,7 +2764,7 @@ describe('Unit test case for ts embed', () => {
2909
2764
  const triggerSpy = jest.spyOn(appEmbed, 'trigger').mockResolvedValue(null);
2910
2765
  const removeChildSpy = jest.spyOn(Node.prototype, 'removeChild').mockImplementation(() => (0, test_utils_1.getRootEl)());
2911
2766
  appEmbed.destroy();
2912
- // Should be called immediately when waitForCleanupOnDestroy is true
2767
+ // Should be called immediately when config is enabled
2913
2768
  expect(triggerSpy).toHaveBeenCalledWith(types_1.HostEvent.DestroyEmbed);
2914
2769
  // Wait for the timeout to complete
2915
2770
  await new Promise(resolve => setTimeout(resolve, 1100));
@@ -2961,5 +2816,324 @@ describe('Unit test case for ts embed', () => {
2961
2816
  });
2962
2817
  });
2963
2818
  });
2819
+ describe('handleApiInterceptEvent', () => {
2820
+ beforeEach(() => {
2821
+ document.body.innerHTML = (0, test_utils_1.getDocumentBody)();
2822
+ (0, index_1.init)({
2823
+ thoughtSpotHost: 'tshost',
2824
+ authType: index_1.AuthType.None,
2825
+ });
2826
+ jest.clearAllMocks();
2827
+ mockHandleInterceptEvent.mockClear();
2828
+ });
2829
+ test('should call handleInterceptEvent with correct parameters', async () => {
2830
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2831
+ await searchEmbed.render();
2832
+ const mockEventData = {
2833
+ type: index_1.EmbedEvent.ApiIntercept,
2834
+ data: JSON.stringify({
2835
+ input: '/prism/?op=GetChartWithData',
2836
+ init: {
2837
+ method: 'POST',
2838
+ body: JSON.stringify({
2839
+ variables: {
2840
+ session: { sessionId: 'session-123' },
2841
+ contextBookId: 'viz-456'
2842
+ }
2843
+ })
2844
+ }
2845
+ })
2846
+ };
2847
+ const mockPort = {
2848
+ postMessage: jest.fn(),
2849
+ };
2850
+ await (0, test_utils_1.executeAfterWait)(() => {
2851
+ const iframe = (0, test_utils_1.getIFrameEl)();
2852
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
2853
+ });
2854
+ await (0, test_utils_1.executeAfterWait)(() => {
2855
+ expect(mockHandleInterceptEvent).toHaveBeenCalledTimes(1);
2856
+ const call = mockHandleInterceptEvent.mock.calls[0][0];
2857
+ expect(call.eventData).toEqual(mockEventData);
2858
+ expect(call.executeEvent).toBeInstanceOf(Function);
2859
+ expect(call.getUnsavedAnswerTml).toBeInstanceOf(Function);
2860
+ expect(call.viewConfig).toMatchObject(defaultViewConfig);
2861
+ });
2862
+ });
2863
+ test('should execute callbacks through executeEvent function', async () => {
2864
+ let capturedExecuteEvent;
2865
+ mockHandleInterceptEvent.mockImplementation((params) => {
2866
+ capturedExecuteEvent = params.executeEvent;
2867
+ });
2868
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2869
+ const mockCallback = jest.fn();
2870
+ searchEmbed.on(index_1.EmbedEvent.CustomAction, mockCallback);
2871
+ await searchEmbed.render();
2872
+ const mockEventData = {
2873
+ type: index_1.EmbedEvent.ApiIntercept,
2874
+ data: JSON.stringify({
2875
+ input: '/prism/?op=GetChartWithData',
2876
+ init: {}
2877
+ })
2878
+ };
2879
+ const mockPort = {
2880
+ postMessage: jest.fn(),
2881
+ };
2882
+ await (0, test_utils_1.executeAfterWait)(() => {
2883
+ const iframe = (0, test_utils_1.getIFrameEl)();
2884
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
2885
+ });
2886
+ await (0, test_utils_1.executeAfterWait)(() => {
2887
+ expect(capturedExecuteEvent).toBeDefined();
2888
+ // Simulate executeEvent being called by handleInterceptEvent
2889
+ const testData = { test: 'data' };
2890
+ capturedExecuteEvent(index_1.EmbedEvent.CustomAction, testData);
2891
+ // executeEvent passes data as first param to callback
2892
+ expect(mockCallback).toHaveBeenCalled();
2893
+ expect(mockCallback.mock.calls[0][0]).toEqual(testData);
2894
+ });
2895
+ });
2896
+ test('should call triggerUIPassThrough through getUnsavedAnswerTml function', async () => {
2897
+ let capturedGetUnsavedAnswerTml;
2898
+ mockHandleInterceptEvent.mockImplementation((params) => {
2899
+ capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
2900
+ });
2901
+ const mockTmlResponse = { tml: 'test-tml-content' };
2902
+ mockProcessTrigger.mockResolvedValue([{ value: mockTmlResponse }]);
2903
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2904
+ await searchEmbed.render();
2905
+ const mockEventData = {
2906
+ type: index_1.EmbedEvent.ApiIntercept,
2907
+ data: JSON.stringify({
2908
+ input: '/prism/?op=GetChartWithData',
2909
+ init: {}
2910
+ })
2911
+ };
2912
+ const mockPort = {
2913
+ postMessage: jest.fn(),
2914
+ };
2915
+ await (0, test_utils_1.executeAfterWait)(() => {
2916
+ const iframe = (0, test_utils_1.getIFrameEl)();
2917
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
2918
+ });
2919
+ await (0, test_utils_1.executeAfterWait)(async () => {
2920
+ expect(capturedGetUnsavedAnswerTml).toBeDefined();
2921
+ // Clear previous calls
2922
+ mockProcessTrigger.mockClear();
2923
+ // Simulate getUnsavedAnswerTml being called by
2924
+ // handleInterceptEvent
2925
+ const result = await capturedGetUnsavedAnswerTml({
2926
+ sessionId: 'session-123',
2927
+ vizId: 'viz-456'
2928
+ });
2929
+ expect(mockProcessTrigger).toHaveBeenCalled();
2930
+ const callArgs = mockProcessTrigger.mock.calls[0];
2931
+ // Verify UIPassthrough event is triggered with the right params
2932
+ expect(callArgs[1]).toBe('UiPassthrough');
2933
+ expect(callArgs[3]).toMatchObject({
2934
+ type: 'getUnsavedAnswerTML',
2935
+ parameters: {
2936
+ sessionId: 'session-123',
2937
+ vizId: 'viz-456'
2938
+ }
2939
+ });
2940
+ expect(result).toEqual(mockTmlResponse);
2941
+ });
2942
+ });
2943
+ test('should pass viewConfig to handleInterceptEvent', async () => {
2944
+ const customViewConfig = {
2945
+ ...defaultViewConfig,
2946
+ interceptUrls: ['/api/test'],
2947
+ interceptTimeout: 5000,
2948
+ };
2949
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), customViewConfig);
2950
+ await searchEmbed.render();
2951
+ const mockEventData = {
2952
+ type: index_1.EmbedEvent.ApiIntercept,
2953
+ data: JSON.stringify({
2954
+ input: '/api/test',
2955
+ init: {}
2956
+ })
2957
+ };
2958
+ const mockPort = {
2959
+ postMessage: jest.fn(),
2960
+ };
2961
+ await (0, test_utils_1.executeAfterWait)(() => {
2962
+ const iframe = (0, test_utils_1.getIFrameEl)();
2963
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
2964
+ });
2965
+ await (0, test_utils_1.executeAfterWait)(() => {
2966
+ const call = mockHandleInterceptEvent.mock.calls[0][0];
2967
+ expect(call.viewConfig).toMatchObject({
2968
+ interceptUrls: ['/api/test'],
2969
+ interceptTimeout: 5000,
2970
+ });
2971
+ });
2972
+ });
2973
+ test('should handle ApiIntercept event with eventPort', async () => {
2974
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2975
+ await searchEmbed.render();
2976
+ const mockEventData = {
2977
+ type: index_1.EmbedEvent.ApiIntercept,
2978
+ data: JSON.stringify({
2979
+ input: '/prism/?op=GetChartWithData',
2980
+ init: {}
2981
+ })
2982
+ };
2983
+ const mockPort = {
2984
+ postMessage: jest.fn(),
2985
+ };
2986
+ await (0, test_utils_1.executeAfterWait)(() => {
2987
+ const iframe = (0, test_utils_1.getIFrameEl)();
2988
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
2989
+ });
2990
+ await (0, test_utils_1.executeAfterWait)(() => {
2991
+ expect(mockHandleInterceptEvent).toHaveBeenCalled();
2992
+ // Verify the executeEvent function uses the port
2993
+ const executeEventFn = mockHandleInterceptEvent.mock.calls[0][0].executeEvent;
2994
+ expect(executeEventFn).toBeDefined();
2995
+ });
2996
+ });
2997
+ test('should not process non-ApiIntercept events through handleApiInterceptEvent', async () => {
2998
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
2999
+ await searchEmbed.render();
3000
+ const mockEventData = {
3001
+ type: index_1.EmbedEvent.Save,
3002
+ data: { answerId: '123' },
3003
+ };
3004
+ const mockPort = {
3005
+ postMessage: jest.fn(),
3006
+ };
3007
+ await (0, test_utils_1.executeAfterWait)(() => {
3008
+ const iframe = (0, test_utils_1.getIFrameEl)();
3009
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
3010
+ });
3011
+ await (0, test_utils_1.executeAfterWait)(() => {
3012
+ expect(mockHandleInterceptEvent).not.toHaveBeenCalled();
3013
+ });
3014
+ });
3015
+ test('should handle multiple ApiIntercept events', async () => {
3016
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3017
+ await searchEmbed.render();
3018
+ const mockEventData1 = {
3019
+ type: index_1.EmbedEvent.ApiIntercept,
3020
+ data: JSON.stringify({
3021
+ input: '/prism/?op=GetChartWithData',
3022
+ init: {}
3023
+ })
3024
+ };
3025
+ const mockEventData2 = {
3026
+ type: index_1.EmbedEvent.ApiIntercept,
3027
+ data: JSON.stringify({
3028
+ input: '/prism/?op=LoadContextBook',
3029
+ init: {}
3030
+ })
3031
+ };
3032
+ const mockPort = {
3033
+ postMessage: jest.fn(),
3034
+ };
3035
+ await (0, test_utils_1.executeAfterWait)(() => {
3036
+ const iframe = (0, test_utils_1.getIFrameEl)();
3037
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData1, mockPort);
3038
+ });
3039
+ await (0, test_utils_1.executeAfterWait)(() => {
3040
+ (0, test_utils_1.postMessageToParent)((0, test_utils_1.getIFrameEl)().contentWindow, mockEventData2, mockPort);
3041
+ });
3042
+ await (0, test_utils_1.executeAfterWait)(() => {
3043
+ expect(mockHandleInterceptEvent).toHaveBeenCalledTimes(2);
3044
+ });
3045
+ });
3046
+ test('should pass eventPort to executeCallbacks', async () => {
3047
+ let capturedExecuteEvent;
3048
+ mockHandleInterceptEvent.mockImplementation((params) => {
3049
+ capturedExecuteEvent = params.executeEvent;
3050
+ });
3051
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3052
+ const mockCallback = jest.fn();
3053
+ searchEmbed.on(index_1.EmbedEvent.ApiIntercept, mockCallback);
3054
+ await searchEmbed.render();
3055
+ const mockEventData = {
3056
+ type: index_1.EmbedEvent.ApiIntercept,
3057
+ data: JSON.stringify({
3058
+ input: '/prism/?op=GetChartWithData',
3059
+ init: {}
3060
+ })
3061
+ };
3062
+ const mockPort = {
3063
+ postMessage: jest.fn(),
3064
+ };
3065
+ await (0, test_utils_1.executeAfterWait)(() => {
3066
+ const iframe = (0, test_utils_1.getIFrameEl)();
3067
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
3068
+ });
3069
+ await (0, test_utils_1.executeAfterWait)(() => {
3070
+ expect(capturedExecuteEvent).toBeDefined();
3071
+ // Call executeEvent with a response
3072
+ const responseData = { execute: true };
3073
+ capturedExecuteEvent(index_1.EmbedEvent.ApiIntercept, responseData);
3074
+ // Verify the callback was invoked with the data
3075
+ expect(mockCallback).toHaveBeenCalled();
3076
+ expect(mockCallback.mock.calls[0][0]).toEqual(responseData);
3077
+ });
3078
+ });
3079
+ test('should handle getUnsavedAnswerTml with empty response', async () => {
3080
+ let capturedGetUnsavedAnswerTml;
3081
+ mockHandleInterceptEvent.mockImplementation((params) => {
3082
+ capturedGetUnsavedAnswerTml = params.getUnsavedAnswerTml;
3083
+ });
3084
+ mockProcessTrigger.mockResolvedValue([]);
3085
+ const searchEmbed = new index_1.SearchEmbed((0, test_utils_1.getRootEl)(), defaultViewConfig);
3086
+ await searchEmbed.render();
3087
+ const mockEventData = {
3088
+ type: index_1.EmbedEvent.ApiIntercept,
3089
+ data: JSON.stringify({
3090
+ input: '/prism/?op=GetChartWithData',
3091
+ init: {}
3092
+ })
3093
+ };
3094
+ const mockPort = {
3095
+ postMessage: jest.fn(),
3096
+ };
3097
+ await (0, test_utils_1.executeAfterWait)(() => {
3098
+ const iframe = (0, test_utils_1.getIFrameEl)();
3099
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
3100
+ });
3101
+ await (0, test_utils_1.executeAfterWait)(async () => {
3102
+ expect(capturedGetUnsavedAnswerTml).toBeDefined();
3103
+ const result = await capturedGetUnsavedAnswerTml({
3104
+ sessionId: 'session-123',
3105
+ vizId: 'viz-456'
3106
+ });
3107
+ expect(result).toBeUndefined();
3108
+ });
3109
+ });
3110
+ test('should work with LiveboardEmbed', async () => {
3111
+ const liveboardEmbed = new index_1.LiveboardEmbed((0, test_utils_1.getRootEl)(), {
3112
+ ...defaultViewConfig,
3113
+ liveboardId: 'test-liveboard-id',
3114
+ });
3115
+ await liveboardEmbed.render();
3116
+ const mockEventData = {
3117
+ type: index_1.EmbedEvent.ApiIntercept,
3118
+ data: JSON.stringify({
3119
+ input: '/prism/?op=LoadContextBook',
3120
+ init: {}
3121
+ })
3122
+ };
3123
+ const mockPort = {
3124
+ postMessage: jest.fn(),
3125
+ };
3126
+ await (0, test_utils_1.executeAfterWait)(() => {
3127
+ const iframe = (0, test_utils_1.getIFrameEl)();
3128
+ (0, test_utils_1.postMessageToParent)(iframe.contentWindow, mockEventData, mockPort);
3129
+ });
3130
+ await (0, test_utils_1.executeAfterWait)(() => {
3131
+ expect(mockHandleInterceptEvent).toHaveBeenCalledTimes(1);
3132
+ expect(mockHandleInterceptEvent).toHaveBeenCalledWith(expect.objectContaining({
3133
+ eventData: mockEventData,
3134
+ }));
3135
+ });
3136
+ });
3137
+ });
2964
3138
  });
2965
3139
  //# sourceMappingURL=ts-embed.spec.js.map