@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
@@ -2057,6 +2057,10 @@ describe('Unit test case for ts embed', () => {
2057
2057
  // The ResizeObserver now tracks the placeholder inside this.el,
2058
2058
  // not this.el itself, so pass it as the target.
2059
2059
  const preRenderPlaceholder = tsEmbedDiv.firstElementChild;
2060
+ preRenderPlaceholder.getBoundingClientRect = jest.fn().mockReturnValue({
2061
+ x: 0, y: 0, width: 987, height: 297,
2062
+ top: 0, left: 0, bottom: 297, right: 987,
2063
+ });
2060
2064
  resizeObserverCb([
2061
2065
  {
2062
2066
  target: preRenderPlaceholder,
@@ -2204,6 +2208,239 @@ describe('Unit test case for ts embed', () => {
2204
2208
  expect(logger_1.logger.error).toHaveBeenCalledWith('PreRender should be called before using syncPreRenderStyle');
2205
2209
  logger_1.logger.error.mockClear();
2206
2210
  });
2211
+ describe('preRenderContainer', () => {
2212
+ it('should append preRenderWrapper to document.body when preRenderContainer is not set', async () => {
2213
+ (0, test_utils_1.createRootEleForEmbed)();
2214
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2215
+ preRenderId: 'container-default',
2216
+ liveboardId: 'myLiveboardId',
2217
+ });
2218
+ await libEmbed.preRender();
2219
+ const preRenderIds = libEmbed.getPreRenderIds();
2220
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2221
+ expect(document.body.contains(preRenderWrapper)).toBe(true);
2222
+ });
2223
+ it('should append preRenderWrapper to the element matching a CSS selector string', async () => {
2224
+ (0, test_utils_1.createRootEleForEmbed)();
2225
+ const customContainer = document.createElement('div');
2226
+ customContainer.id = 'custom-pre-render-container';
2227
+ document.body.appendChild(customContainer);
2228
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2229
+ preRenderId: 'container-selector',
2230
+ liveboardId: 'myLiveboardId',
2231
+ preRenderContainer: '#custom-pre-render-container',
2232
+ });
2233
+ await libEmbed.preRender();
2234
+ const preRenderIds = libEmbed.getPreRenderIds();
2235
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2236
+ expect(customContainer.contains(preRenderWrapper)).toBe(true);
2237
+ customContainer.remove();
2238
+ });
2239
+ it('should fall back to document.body when the CSS selector string matches nothing', async () => {
2240
+ (0, test_utils_1.createRootEleForEmbed)();
2241
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2242
+ preRenderId: 'container-selector-miss',
2243
+ liveboardId: 'myLiveboardId',
2244
+ preRenderContainer: '#does-not-exist',
2245
+ });
2246
+ await libEmbed.preRender();
2247
+ const preRenderIds = libEmbed.getPreRenderIds();
2248
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2249
+ expect(document.body.contains(preRenderWrapper)).toBe(true);
2250
+ });
2251
+ it('should fall back to document.body and log an error when the CSS selector is invalid', async () => {
2252
+ (0, test_utils_1.createRootEleForEmbed)();
2253
+ jest.spyOn(logger_1.logger, 'error').mockImplementation(jest.fn());
2254
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2255
+ preRenderId: 'container-selector-invalid',
2256
+ liveboardId: 'myLiveboardId',
2257
+ preRenderContainer: '###invalid###',
2258
+ });
2259
+ await libEmbed.preRender();
2260
+ const preRenderIds = libEmbed.getPreRenderIds();
2261
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2262
+ expect(document.body.contains(preRenderWrapper)).toBe(true);
2263
+ expect(logger_1.logger.error).toHaveBeenCalledWith(expect.stringContaining('Invalid CSS selector for preRenderContainer'), expect.any(Error));
2264
+ logger_1.logger.error.mockClear();
2265
+ });
2266
+ it('should append preRenderWrapper to an Element passed directly as preRenderContainer', async () => {
2267
+ (0, test_utils_1.createRootEleForEmbed)();
2268
+ const customContainer = document.createElement('div');
2269
+ customContainer.id = 'custom-pre-render-element';
2270
+ document.body.appendChild(customContainer);
2271
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2272
+ preRenderId: 'container-element',
2273
+ liveboardId: 'myLiveboardId',
2274
+ preRenderContainer: customContainer,
2275
+ });
2276
+ await libEmbed.preRender();
2277
+ const preRenderIds = libEmbed.getPreRenderIds();
2278
+ const preRenderWrapper = document.getElementById(preRenderIds.wrapper);
2279
+ expect(customContainer.contains(preRenderWrapper)).toBe(true);
2280
+ customContainer.remove();
2281
+ });
2282
+ it('should set the container position to relative when it is static', async () => {
2283
+ (0, test_utils_1.createRootEleForEmbed)();
2284
+ const customContainer = document.createElement('div');
2285
+ customContainer.id = 'custom-pre-render-static';
2286
+ customContainer.style.position = 'static';
2287
+ document.body.appendChild(customContainer);
2288
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2289
+ preRenderId: 'container-position-static',
2290
+ liveboardId: 'myLiveboardId',
2291
+ preRenderContainer: customContainer,
2292
+ });
2293
+ await libEmbed.preRender();
2294
+ expect(customContainer.style.position).toBe('relative');
2295
+ customContainer.remove();
2296
+ });
2297
+ it('should restore the original container position on destroy', async () => {
2298
+ (0, test_utils_1.createRootEleForEmbed)();
2299
+ const customContainer = document.createElement('div');
2300
+ customContainer.id = 'custom-pre-render-restore';
2301
+ customContainer.style.position = 'static';
2302
+ document.body.appendChild(customContainer);
2303
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2304
+ preRenderId: 'container-position-restore',
2305
+ liveboardId: 'myLiveboardId',
2306
+ preRenderContainer: customContainer,
2307
+ });
2308
+ await libEmbed.preRender();
2309
+ expect(customContainer.style.position).toBe('relative');
2310
+ libEmbed.destroy();
2311
+ // Reverts to the exact value the container had before.
2312
+ expect(customContainer.style.position).toBe('static');
2313
+ // The container reference is dropped so a destroyed embed does
2314
+ // not pin the (possibly detached) element in memory.
2315
+ expect(libEmbed.preRenderContainerEl).toBeNull();
2316
+ customContainer.remove();
2317
+ });
2318
+ it('should not touch the container position when it is already positioned', async () => {
2319
+ (0, test_utils_1.createRootEleForEmbed)();
2320
+ const customContainer = document.createElement('div');
2321
+ customContainer.id = 'custom-pre-render-positioned';
2322
+ customContainer.style.position = 'absolute';
2323
+ document.body.appendChild(customContainer);
2324
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2325
+ preRenderId: 'container-position-positioned',
2326
+ liveboardId: 'myLiveboardId',
2327
+ preRenderContainer: customContainer,
2328
+ });
2329
+ await libEmbed.preRender();
2330
+ expect(customContainer.style.position).toBe('absolute');
2331
+ libEmbed.destroy();
2332
+ expect(customContainer.style.position).toBe('absolute');
2333
+ customContainer.remove();
2334
+ });
2335
+ it('should keep the container positioned on destroy while another preRender wrapper remains', async () => {
2336
+ (0, test_utils_1.createRootEleForEmbed)();
2337
+ const customContainer = document.createElement('div');
2338
+ customContainer.id = 'custom-pre-render-shared';
2339
+ customContainer.style.position = 'static';
2340
+ document.body.appendChild(customContainer);
2341
+ const firstEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2342
+ preRenderId: 'container-shared-first',
2343
+ liveboardId: 'myLiveboardId',
2344
+ preRenderContainer: customContainer,
2345
+ });
2346
+ await firstEmbed.preRender();
2347
+ const secondEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2348
+ preRenderId: 'container-shared-second',
2349
+ liveboardId: 'myLiveboardId',
2350
+ preRenderContainer: customContainer,
2351
+ });
2352
+ await secondEmbed.preRender();
2353
+ expect(customContainer.style.position).toBe('relative');
2354
+ // Destroying the first embed must not strip the positioning
2355
+ // context the second embed still relies on.
2356
+ firstEmbed.destroy();
2357
+ expect(customContainer.style.position).toBe('relative');
2358
+ // Once the last embed is destroyed, the override is reverted.
2359
+ secondEmbed.destroy();
2360
+ expect(customContainer.style.position).toBe('static');
2361
+ customContainer.remove();
2362
+ });
2363
+ it('should resolve a selector container inside the host shadow root', async () => {
2364
+ const host = document.createElement('div');
2365
+ document.body.appendChild(host);
2366
+ const shadow = host.attachShadow({ mode: 'open' });
2367
+ const hostEl = document.createElement('div');
2368
+ const shadowContainer = document.createElement('div');
2369
+ shadowContainer.id = 'shadow-pre-render-container';
2370
+ shadow.appendChild(hostEl);
2371
+ shadow.appendChild(shadowContainer);
2372
+ const libEmbed = new index_1.LiveboardEmbed(hostEl, {
2373
+ preRenderId: 'container-shadow',
2374
+ liveboardId: 'myLiveboardId',
2375
+ preRenderContainer: '#shadow-pre-render-container',
2376
+ });
2377
+ await libEmbed.preRender();
2378
+ const preRenderIds = libEmbed.getPreRenderIds();
2379
+ const preRenderWrapper = shadow.querySelector(`#${preRenderIds.wrapper}`);
2380
+ // The wrapper lands in the shadow container, not the body.
2381
+ expect(shadowContainer.contains(preRenderWrapper)).toBe(true);
2382
+ expect(document.getElementById(preRenderIds.wrapper)).toBeNull();
2383
+ host.remove();
2384
+ });
2385
+ it('should re-attach the wrapper when a selector container is remounted', async () => {
2386
+ (0, test_utils_1.createRootEleForEmbed)();
2387
+ const oldContainer = document.createElement('div');
2388
+ oldContainer.id = 'remount-container';
2389
+ document.body.appendChild(oldContainer);
2390
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2391
+ preRenderId: 'container-remount',
2392
+ liveboardId: 'myLiveboardId',
2393
+ preRenderContainer: '#remount-container',
2394
+ doNotTrackPreRenderSize: true,
2395
+ });
2396
+ libEmbed.preRender();
2397
+ await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
2398
+ await libEmbed.showPreRender();
2399
+ const preRenderIds = libEmbed.getPreRenderIds();
2400
+ const wrapper = document.getElementById(preRenderIds.wrapper);
2401
+ expect(oldContainer.contains(wrapper)).toBe(true);
2402
+ // Simulate React remounting the container: the old node (with
2403
+ // our wrapper) is detached and a fresh node takes its place.
2404
+ const removeSpy = jest.spyOn(oldContainer, 'removeEventListener');
2405
+ oldContainer.remove();
2406
+ const newContainer = document.createElement('div');
2407
+ newContainer.id = 'remount-container';
2408
+ document.body.appendChild(newContainer);
2409
+ const addSpy = jest.spyOn(newContainer, 'addEventListener');
2410
+ // A reposition (scroll/resize/re-show) heals the stale ref.
2411
+ libEmbed.syncPreRenderStyle();
2412
+ expect(newContainer.contains(wrapper)).toBe(true);
2413
+ expect(oldContainer.contains(wrapper)).toBe(false);
2414
+ // The scroll listener is migrated to the live container.
2415
+ expect(removeSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
2416
+ expect(addSpy).toHaveBeenCalledWith('scroll', expect.any(Function));
2417
+ libEmbed.destroy();
2418
+ newContainer.remove();
2419
+ });
2420
+ it('should leave an element-passed container untouched when it is detached', async () => {
2421
+ (0, test_utils_1.createRootEleForEmbed)();
2422
+ const container = document.createElement('div');
2423
+ document.body.appendChild(container);
2424
+ const libEmbed = new index_1.LiveboardEmbed('#tsEmbedDiv', {
2425
+ preRenderId: 'container-element-remount',
2426
+ liveboardId: 'myLiveboardId',
2427
+ preRenderContainer: container,
2428
+ doNotTrackPreRenderSize: true,
2429
+ });
2430
+ libEmbed.preRender();
2431
+ await (0, test_utils_1.waitFor)(() => !!(0, test_utils_1.getIFrameEl)());
2432
+ await libEmbed.showPreRender();
2433
+ const preRenderIds = libEmbed.getPreRenderIds();
2434
+ const wrapper = document.getElementById(preRenderIds.wrapper);
2435
+ expect(container.contains(wrapper)).toBe(true);
2436
+ // Detach the element container; it cannot be re-resolved, so
2437
+ // the wrapper stays with it (no crash, no body fallback).
2438
+ container.remove();
2439
+ libEmbed.syncPreRenderStyle();
2440
+ expect(container.contains(wrapper)).toBe(true);
2441
+ libEmbed.destroy();
2442
+ });
2443
+ });
2207
2444
  });
2208
2445
  describe('IdleSessionTimeout embedEvent for TrustedAuthTokenCookieless authType with autoLogin true', () => {
2209
2446
  beforeAll(() => {