@thoughtspot/visual-embed-sdk 1.49.1 → 1.49.3

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 (151) hide show
  1. package/cjs/package.json +4 -10
  2. package/cjs/src/css-variables.d.ts +17 -0
  3. package/cjs/src/css-variables.d.ts.map +1 -1
  4. package/cjs/src/embed/app.d.ts +7 -1
  5. package/cjs/src/embed/app.d.ts.map +1 -1
  6. package/cjs/src/embed/app.js +4 -1
  7. package/cjs/src/embed/app.js.map +1 -1
  8. package/cjs/src/embed/app.spec.js +97 -0
  9. package/cjs/src/embed/app.spec.js.map +1 -1
  10. package/cjs/src/embed/conversation.d.ts +8 -0
  11. package/cjs/src/embed/conversation.d.ts.map +1 -1
  12. package/cjs/src/embed/conversation.js +2 -1
  13. package/cjs/src/embed/conversation.js.map +1 -1
  14. package/cjs/src/embed/conversation.spec.js +12 -0
  15. package/cjs/src/embed/conversation.spec.js.map +1 -1
  16. package/cjs/src/embed/events.spec.js +5 -0
  17. package/cjs/src/embed/events.spec.js.map +1 -1
  18. package/cjs/src/embed/liveboard.d.ts +6 -0
  19. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  20. package/cjs/src/embed/liveboard.js +4 -1
  21. package/cjs/src/embed/liveboard.js.map +1 -1
  22. package/cjs/src/embed/liveboard.spec.js +11 -0
  23. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  24. package/cjs/src/embed/spotter-viz-utils.d.ts +29 -0
  25. package/cjs/src/embed/spotter-viz-utils.d.ts.map +1 -1
  26. package/cjs/src/embed/spotter-viz-utils.js.map +1 -1
  27. package/cjs/src/embed/ts-embed.d.ts +38 -0
  28. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  29. package/cjs/src/embed/ts-embed.js +166 -9
  30. package/cjs/src/embed/ts-embed.js.map +1 -1
  31. package/cjs/src/embed/ts-embed.spec.js +237 -0
  32. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  33. package/cjs/src/index.d.ts +2 -2
  34. package/cjs/src/index.d.ts.map +1 -1
  35. package/cjs/src/index.js.map +1 -1
  36. package/cjs/src/types.d.ts +87 -4
  37. package/cjs/src/types.d.ts.map +1 -1
  38. package/cjs/src/types.js +47 -3
  39. package/cjs/src/types.js.map +1 -1
  40. package/cjs/src/utils/graphql/answerService/answerService.spec.js +15 -0
  41. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  42. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  43. package/cjs/src/utils/processTrigger.js +6 -5
  44. package/cjs/src/utils/processTrigger.js.map +1 -1
  45. package/cjs/src/utils/processTrigger.spec.js +13 -0
  46. package/cjs/src/utils/processTrigger.spec.js.map +1 -1
  47. package/cjs/src/utils.d.ts +10 -0
  48. package/cjs/src/utils.d.ts.map +1 -1
  49. package/cjs/src/utils.js +25 -4
  50. package/cjs/src/utils.js.map +1 -1
  51. package/cjs/src/utils.spec.js +48 -0
  52. package/cjs/src/utils.spec.js.map +1 -1
  53. package/dist/{index-B6Rn561t.js → index-DsSQndIB.js} +303 -187
  54. package/dist/src/css-variables.d.ts +17 -0
  55. package/dist/src/css-variables.d.ts.map +1 -1
  56. package/dist/src/embed/app.d.ts +7 -1
  57. package/dist/src/embed/app.d.ts.map +1 -1
  58. package/dist/src/embed/conversation.d.ts +8 -0
  59. package/dist/src/embed/conversation.d.ts.map +1 -1
  60. package/dist/src/embed/liveboard.d.ts +6 -0
  61. package/dist/src/embed/liveboard.d.ts.map +1 -1
  62. package/dist/src/embed/spotter-viz-utils.d.ts +29 -0
  63. package/dist/src/embed/spotter-viz-utils.d.ts.map +1 -1
  64. package/dist/src/embed/ts-embed.d.ts +38 -0
  65. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  66. package/dist/src/index.d.ts +2 -2
  67. package/dist/src/index.d.ts.map +1 -1
  68. package/dist/src/types.d.ts +87 -4
  69. package/dist/src/types.d.ts.map +1 -1
  70. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  71. package/dist/src/utils.d.ts +10 -0
  72. package/dist/src/utils.d.ts.map +1 -1
  73. package/dist/tsembed-react.es.js +282 -35
  74. package/dist/tsembed-react.js +583 -220
  75. package/dist/tsembed.es.js +282 -35
  76. package/dist/tsembed.js +583 -220
  77. package/dist/visual-embed-sdk-react-full.d.ts +190 -4
  78. package/dist/visual-embed-sdk-react.d.ts +190 -4
  79. package/dist/visual-embed-sdk.d.ts +190 -4
  80. package/lib/package.json +4 -10
  81. package/lib/src/css-variables.d.ts +17 -0
  82. package/lib/src/css-variables.d.ts.map +1 -1
  83. package/lib/src/embed/app.d.ts +7 -1
  84. package/lib/src/embed/app.d.ts.map +1 -1
  85. package/lib/src/embed/app.js +4 -1
  86. package/lib/src/embed/app.js.map +1 -1
  87. package/lib/src/embed/app.spec.js +97 -0
  88. package/lib/src/embed/app.spec.js.map +1 -1
  89. package/lib/src/embed/conversation.d.ts +8 -0
  90. package/lib/src/embed/conversation.d.ts.map +1 -1
  91. package/lib/src/embed/conversation.js +2 -1
  92. package/lib/src/embed/conversation.js.map +1 -1
  93. package/lib/src/embed/conversation.spec.js +12 -0
  94. package/lib/src/embed/conversation.spec.js.map +1 -1
  95. package/lib/src/embed/events.spec.js +5 -0
  96. package/lib/src/embed/events.spec.js.map +1 -1
  97. package/lib/src/embed/liveboard.d.ts +6 -0
  98. package/lib/src/embed/liveboard.d.ts.map +1 -1
  99. package/lib/src/embed/liveboard.js +4 -1
  100. package/lib/src/embed/liveboard.js.map +1 -1
  101. package/lib/src/embed/liveboard.spec.js +11 -0
  102. package/lib/src/embed/liveboard.spec.js.map +1 -1
  103. package/lib/src/embed/spotter-viz-utils.d.ts +29 -0
  104. package/lib/src/embed/spotter-viz-utils.d.ts.map +1 -1
  105. package/lib/src/embed/spotter-viz-utils.js.map +1 -1
  106. package/lib/src/embed/ts-embed.d.ts +38 -0
  107. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  108. package/lib/src/embed/ts-embed.js +167 -10
  109. package/lib/src/embed/ts-embed.js.map +1 -1
  110. package/lib/src/embed/ts-embed.spec.js +237 -0
  111. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  112. package/lib/src/index.d.ts +2 -2
  113. package/lib/src/index.d.ts.map +1 -1
  114. package/lib/src/index.js.map +1 -1
  115. package/lib/src/types.d.ts +87 -4
  116. package/lib/src/types.d.ts.map +1 -1
  117. package/lib/src/types.js +47 -3
  118. package/lib/src/types.js.map +1 -1
  119. package/lib/src/utils/graphql/answerService/answerService.spec.js +15 -0
  120. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  121. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  122. package/lib/src/utils/processTrigger.js +6 -5
  123. package/lib/src/utils/processTrigger.js.map +1 -1
  124. package/lib/src/utils/processTrigger.spec.js +13 -0
  125. package/lib/src/utils/processTrigger.spec.js.map +1 -1
  126. package/lib/src/utils.d.ts +10 -0
  127. package/lib/src/utils.d.ts.map +1 -1
  128. package/lib/src/utils.js +22 -1
  129. package/lib/src/utils.js.map +1 -1
  130. package/lib/src/utils.spec.js +49 -1
  131. package/lib/src/utils.spec.js.map +1 -1
  132. package/lib/src/visual-embed-sdk.d.ts +190 -4
  133. package/package.json +4 -10
  134. package/src/css-variables.ts +20 -0
  135. package/src/embed/app.spec.ts +109 -0
  136. package/src/embed/app.ts +11 -1
  137. package/src/embed/conversation.spec.ts +17 -0
  138. package/src/embed/conversation.ts +10 -0
  139. package/src/embed/events.spec.ts +7 -0
  140. package/src/embed/liveboard.spec.ts +15 -0
  141. package/src/embed/liveboard.ts +10 -0
  142. package/src/embed/spotter-viz-utils.ts +30 -0
  143. package/src/embed/ts-embed.spec.ts +294 -0
  144. package/src/embed/ts-embed.ts +180 -9
  145. package/src/index.ts +2 -1
  146. package/src/types.ts +86 -3
  147. package/src/utils/graphql/answerService/answerService.spec.ts +18 -0
  148. package/src/utils/processTrigger.spec.ts +23 -0
  149. package/src/utils/processTrigger.ts +8 -6
  150. package/src/utils.spec.ts +63 -0
  151. package/src/utils.ts +25 -1
@@ -2053,6 +2053,10 @@ describe('Unit test case for ts embed', () => {
2053
2053
  // The ResizeObserver now tracks the placeholder inside this.el,
2054
2054
  // not this.el itself, so pass it as the target.
2055
2055
  const preRenderPlaceholder = tsEmbedDiv.firstElementChild;
2056
+ preRenderPlaceholder.getBoundingClientRect = jest.fn().mockReturnValue({
2057
+ x: 0, y: 0, width: 987, height: 297,
2058
+ top: 0, left: 0, bottom: 297, right: 987,
2059
+ });
2056
2060
  resizeObserverCb([
2057
2061
  {
2058
2062
  target: preRenderPlaceholder,
@@ -2200,6 +2204,239 @@ describe('Unit test case for ts embed', () => {
2200
2204
  expect(logger.error).toHaveBeenCalledWith('PreRender should be called before using syncPreRenderStyle');
2201
2205
  logger.error.mockClear();
2202
2206
  });
2207
+ describe('preRenderContainer', () => {
2208
+ it('should append preRenderWrapper to document.body when preRenderContainer is not set', async () => {
2209
+ createRootEleForEmbed();
2210
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2211
+ preRenderId: 'container-default',
2212
+ liveboardId: 'myLiveboardId',
2213
+ });
2214
+ await libEmbed.preRender();
2215
+ const preRenderIds = libEmbed.getPreRenderIds();
2216
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2217
+ expect(document.body.contains(preRenderWrapper)).toBe(true);
2218
+ });
2219
+ it('should append preRenderWrapper to the element matching a CSS selector string', async () => {
2220
+ createRootEleForEmbed();
2221
+ const customContainer = document.createElement('div');
2222
+ customContainer.id = 'custom-pre-render-container';
2223
+ document.body.appendChild(customContainer);
2224
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2225
+ preRenderId: 'container-selector',
2226
+ liveboardId: 'myLiveboardId',
2227
+ preRenderContainer: '#custom-pre-render-container',
2228
+ });
2229
+ await libEmbed.preRender();
2230
+ const preRenderIds = libEmbed.getPreRenderIds();
2231
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2232
+ expect(customContainer.contains(preRenderWrapper)).toBe(true);
2233
+ customContainer.remove();
2234
+ });
2235
+ it('should fall back to document.body when the CSS selector string matches nothing', async () => {
2236
+ createRootEleForEmbed();
2237
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2238
+ preRenderId: 'container-selector-miss',
2239
+ liveboardId: 'myLiveboardId',
2240
+ preRenderContainer: '#does-not-exist',
2241
+ });
2242
+ await libEmbed.preRender();
2243
+ const preRenderIds = libEmbed.getPreRenderIds();
2244
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2245
+ expect(document.body.contains(preRenderWrapper)).toBe(true);
2246
+ });
2247
+ it('should fall back to document.body and log an error when the CSS selector is invalid', async () => {
2248
+ createRootEleForEmbed();
2249
+ jest.spyOn(logger, 'error').mockImplementation(jest.fn());
2250
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2251
+ preRenderId: 'container-selector-invalid',
2252
+ liveboardId: 'myLiveboardId',
2253
+ preRenderContainer: '###invalid###',
2254
+ });
2255
+ await libEmbed.preRender();
2256
+ const preRenderIds = libEmbed.getPreRenderIds();
2257
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2258
+ expect(document.body.contains(preRenderWrapper)).toBe(true);
2259
+ expect(logger.error).toHaveBeenCalledWith(expect.stringContaining('Invalid CSS selector for preRenderContainer'), expect.any(Error));
2260
+ logger.error.mockClear();
2261
+ });
2262
+ it('should append preRenderWrapper to an Element passed directly as preRenderContainer', async () => {
2263
+ createRootEleForEmbed();
2264
+ const customContainer = document.createElement('div');
2265
+ customContainer.id = 'custom-pre-render-element';
2266
+ document.body.appendChild(customContainer);
2267
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2268
+ preRenderId: 'container-element',
2269
+ liveboardId: 'myLiveboardId',
2270
+ preRenderContainer: customContainer,
2271
+ });
2272
+ await libEmbed.preRender();
2273
+ const preRenderIds = libEmbed.getPreRenderIds();
2274
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2275
+ expect(customContainer.contains(preRenderWrapper)).toBe(true);
2276
+ customContainer.remove();
2277
+ });
2278
+ it('should set the container position to relative when it is static', async () => {
2279
+ createRootEleForEmbed();
2280
+ const customContainer = document.createElement('div');
2281
+ customContainer.id = 'custom-pre-render-static';
2282
+ customContainer.style.position = 'static';
2283
+ document.body.appendChild(customContainer);
2284
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2285
+ preRenderId: 'container-position-static',
2286
+ liveboardId: 'myLiveboardId',
2287
+ preRenderContainer: customContainer,
2288
+ });
2289
+ await libEmbed.preRender();
2290
+ expect(customContainer.style.position).toBe('relative');
2291
+ customContainer.remove();
2292
+ });
2293
+ it('should restore the original container position on destroy', async () => {
2294
+ createRootEleForEmbed();
2295
+ const customContainer = document.createElement('div');
2296
+ customContainer.id = 'custom-pre-render-restore';
2297
+ customContainer.style.position = 'static';
2298
+ document.body.appendChild(customContainer);
2299
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2300
+ preRenderId: 'container-position-restore',
2301
+ liveboardId: 'myLiveboardId',
2302
+ preRenderContainer: customContainer,
2303
+ });
2304
+ await libEmbed.preRender();
2305
+ expect(customContainer.style.position).toBe('relative');
2306
+ libEmbed.destroy();
2307
+ // Reverts to the exact value the container had before.
2308
+ expect(customContainer.style.position).toBe('static');
2309
+ // The container reference is dropped so a destroyed embed does
2310
+ // not pin the (possibly detached) element in memory.
2311
+ expect(libEmbed.preRenderContainerEl).toBeNull();
2312
+ customContainer.remove();
2313
+ });
2314
+ it('should not touch the container position when it is already positioned', async () => {
2315
+ createRootEleForEmbed();
2316
+ const customContainer = document.createElement('div');
2317
+ customContainer.id = 'custom-pre-render-positioned';
2318
+ customContainer.style.position = 'absolute';
2319
+ document.body.appendChild(customContainer);
2320
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2321
+ preRenderId: 'container-position-positioned',
2322
+ liveboardId: 'myLiveboardId',
2323
+ preRenderContainer: customContainer,
2324
+ });
2325
+ await libEmbed.preRender();
2326
+ expect(customContainer.style.position).toBe('absolute');
2327
+ libEmbed.destroy();
2328
+ expect(customContainer.style.position).toBe('absolute');
2329
+ customContainer.remove();
2330
+ });
2331
+ it('should keep the container positioned on destroy while another preRender wrapper remains', async () => {
2332
+ createRootEleForEmbed();
2333
+ const customContainer = document.createElement('div');
2334
+ customContainer.id = 'custom-pre-render-shared';
2335
+ customContainer.style.position = 'static';
2336
+ document.body.appendChild(customContainer);
2337
+ const firstEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2338
+ preRenderId: 'container-shared-first',
2339
+ liveboardId: 'myLiveboardId',
2340
+ preRenderContainer: customContainer,
2341
+ });
2342
+ await firstEmbed.preRender();
2343
+ const secondEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2344
+ preRenderId: 'container-shared-second',
2345
+ liveboardId: 'myLiveboardId',
2346
+ preRenderContainer: customContainer,
2347
+ });
2348
+ await secondEmbed.preRender();
2349
+ expect(customContainer.style.position).toBe('relative');
2350
+ // Destroying the first embed must not strip the positioning
2351
+ // context the second embed still relies on.
2352
+ firstEmbed.destroy();
2353
+ expect(customContainer.style.position).toBe('relative');
2354
+ // Once the last embed is destroyed, the override is reverted.
2355
+ secondEmbed.destroy();
2356
+ expect(customContainer.style.position).toBe('static');
2357
+ customContainer.remove();
2358
+ });
2359
+ it('should resolve a selector container inside the host shadow root', async () => {
2360
+ const host = document.createElement('div');
2361
+ document.body.appendChild(host);
2362
+ const shadow = host.attachShadow({ mode: 'open' });
2363
+ const hostEl = document.createElement('div');
2364
+ const shadowContainer = document.createElement('div');
2365
+ shadowContainer.id = 'shadow-pre-render-container';
2366
+ shadow.appendChild(hostEl);
2367
+ shadow.appendChild(shadowContainer);
2368
+ const libEmbed = new LiveboardEmbed(hostEl, {
2369
+ preRenderId: 'container-shadow',
2370
+ liveboardId: 'myLiveboardId',
2371
+ preRenderContainer: '#shadow-pre-render-container',
2372
+ });
2373
+ await libEmbed.preRender();
2374
+ const preRenderIds = libEmbed.getPreRenderIds();
2375
+ const preRenderWrapper = shadow.querySelector(`#${preRenderIds.wrapper}`);
2376
+ // The wrapper lands in the shadow container, not the body.
2377
+ expect(shadowContainer.contains(preRenderWrapper)).toBe(true);
2378
+ expect(document.getElementById(preRenderIds.wrapper)).toBeNull();
2379
+ host.remove();
2380
+ });
2381
+ it('should re-attach the wrapper when a selector container is remounted', async () => {
2382
+ createRootEleForEmbed();
2383
+ const oldContainer = document.createElement('div');
2384
+ oldContainer.id = 'remount-container';
2385
+ document.body.appendChild(oldContainer);
2386
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2387
+ preRenderId: 'container-remount',
2388
+ liveboardId: 'myLiveboardId',
2389
+ preRenderContainer: '#remount-container',
2390
+ doNotTrackPreRenderSize: true,
2391
+ });
2392
+ libEmbed.preRender();
2393
+ await waitFor(() => !!getIFrameEl());
2394
+ await libEmbed.showPreRender();
2395
+ const preRenderIds = libEmbed.getPreRenderIds();
2396
+ const wrapper = document.getElementById(preRenderIds.wrapper);
2397
+ expect(oldContainer.contains(wrapper)).toBe(true);
2398
+ // Simulate React remounting the container: the old node (with
2399
+ // our wrapper) is detached and a fresh node takes its place.
2400
+ const removeSpy = jest.spyOn(oldContainer, 'removeEventListener');
2401
+ oldContainer.remove();
2402
+ const newContainer = document.createElement('div');
2403
+ newContainer.id = 'remount-container';
2404
+ document.body.appendChild(newContainer);
2405
+ const addSpy = jest.spyOn(newContainer, 'addEventListener');
2406
+ // A reposition (scroll/resize/re-show) heals the stale ref.
2407
+ libEmbed.syncPreRenderStyle();
2408
+ expect(newContainer.contains(wrapper)).toBe(true);
2409
+ expect(oldContainer.contains(wrapper)).toBe(false);
2410
+ // The scroll listener is migrated to the live container.
2411
+ expect(removeSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
2412
+ expect(addSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
2413
+ libEmbed.destroy();
2414
+ newContainer.remove();
2415
+ });
2416
+ it('should leave an element-passed container untouched when it is detached', async () => {
2417
+ createRootEleForEmbed();
2418
+ const container = document.createElement('div');
2419
+ document.body.appendChild(container);
2420
+ const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
2421
+ preRenderId: 'container-element-remount',
2422
+ liveboardId: 'myLiveboardId',
2423
+ preRenderContainer: container,
2424
+ doNotTrackPreRenderSize: true,
2425
+ });
2426
+ libEmbed.preRender();
2427
+ await waitFor(() => !!getIFrameEl());
2428
+ await libEmbed.showPreRender();
2429
+ const preRenderIds = libEmbed.getPreRenderIds();
2430
+ const wrapper = document.getElementById(preRenderIds.wrapper);
2431
+ expect(container.contains(wrapper)).toBe(true);
2432
+ // Detach the element container; it cannot be re-resolved, so
2433
+ // the wrapper stays with it (no crash, no body fallback).
2434
+ container.remove();
2435
+ libEmbed.syncPreRenderStyle();
2436
+ expect(container.contains(wrapper)).toBe(true);
2437
+ libEmbed.destroy();
2438
+ });
2439
+ });
2203
2440
  });
2204
2441
  describe('IdleSessionTimeout embedEvent for TrustedAuthTokenCookieless authType with autoLogin true', () => {
2205
2442
  beforeAll(() => {