@thoughtspot/visual-embed-sdk 1.45.1 → 1.45.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 (213) hide show
  1. package/cjs/package.json +1 -1
  2. package/cjs/src/authToken.d.ts +1 -1
  3. package/cjs/src/authToken.d.ts.map +1 -1
  4. package/cjs/src/authToken.js +2 -2
  5. package/cjs/src/authToken.js.map +1 -1
  6. package/cjs/src/authToken.spec.js +71 -0
  7. package/cjs/src/authToken.spec.js.map +1 -1
  8. package/cjs/src/css-variables.d.ts +48 -0
  9. package/cjs/src/css-variables.d.ts.map +1 -1
  10. package/cjs/src/embed/app.d.ts +37 -0
  11. package/cjs/src/embed/app.d.ts.map +1 -1
  12. package/cjs/src/embed/app.js +37 -1
  13. package/cjs/src/embed/app.js.map +1 -1
  14. package/cjs/src/embed/app.spec.js +24 -0
  15. package/cjs/src/embed/app.spec.js.map +1 -1
  16. package/cjs/src/embed/conversation.d.ts +127 -9
  17. package/cjs/src/embed/conversation.d.ts.map +1 -1
  18. package/cjs/src/embed/conversation.js +41 -18
  19. package/cjs/src/embed/conversation.js.map +1 -1
  20. package/cjs/src/embed/conversation.spec.js +96 -3
  21. package/cjs/src/embed/conversation.spec.js.map +1 -1
  22. package/cjs/src/embed/hostEventClient/contracts.d.ts +3 -3
  23. package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  24. package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
  25. package/cjs/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  26. package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  27. package/cjs/src/embed/hostEventClient/host-event-client.js +18 -18
  28. package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
  29. package/cjs/src/embed/hostEventClient/host-event-client.spec.js +7 -7
  30. package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  31. package/cjs/src/embed/liveboard.d.ts +40 -3
  32. package/cjs/src/embed/liveboard.d.ts.map +1 -1
  33. package/cjs/src/embed/liveboard.js +40 -12
  34. package/cjs/src/embed/liveboard.js.map +1 -1
  35. package/cjs/src/embed/liveboard.spec.js +180 -8
  36. package/cjs/src/embed/liveboard.spec.js.map +1 -1
  37. package/cjs/src/embed/ts-embed.d.ts +23 -2
  38. package/cjs/src/embed/ts-embed.d.ts.map +1 -1
  39. package/cjs/src/embed/ts-embed.js +64 -22
  40. package/cjs/src/embed/ts-embed.js.map +1 -1
  41. package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
  42. package/cjs/src/embed/ts-embed.spec.js +138 -19
  43. package/cjs/src/embed/ts-embed.spec.js.map +1 -1
  44. package/cjs/src/errors.d.ts +1 -0
  45. package/cjs/src/errors.d.ts.map +1 -1
  46. package/cjs/src/errors.js +1 -0
  47. package/cjs/src/errors.js.map +1 -1
  48. package/cjs/src/index.d.ts +3 -3
  49. package/cjs/src/index.d.ts.map +1 -1
  50. package/cjs/src/index.js +3 -2
  51. package/cjs/src/index.js.map +1 -1
  52. package/cjs/src/types.d.ts +356 -42
  53. package/cjs/src/types.d.ts.map +1 -1
  54. package/cjs/src/types.js +227 -20
  55. package/cjs/src/types.js.map +1 -1
  56. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  57. package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  58. package/cjs/src/utils/graphql/answerService/answer-queries.js +23 -1
  59. package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  60. package/cjs/src/utils/graphql/answerService/answerService.d.ts +2 -1
  61. package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  62. package/cjs/src/utils/graphql/answerService/answerService.js +9 -1
  63. package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
  64. package/cjs/src/utils/graphql/answerService/answerService.spec.js +73 -0
  65. package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  66. package/cjs/src/utils/processTrigger.d.ts +3 -2
  67. package/cjs/src/utils/processTrigger.d.ts.map +1 -1
  68. package/cjs/src/utils/processTrigger.js +4 -2
  69. package/cjs/src/utils/processTrigger.js.map +1 -1
  70. package/cjs/src/utils.d.ts +20 -1
  71. package/cjs/src/utils.d.ts.map +1 -1
  72. package/cjs/src/utils.js +40 -1
  73. package/cjs/src/utils.js.map +1 -1
  74. package/cjs/src/utils.spec.js +49 -0
  75. package/cjs/src/utils.spec.js.map +1 -1
  76. package/dist/{index-Dgzjq7qH.js → index-BuwECGdm.js} +1 -1
  77. package/dist/src/authToken.d.ts +1 -1
  78. package/dist/src/authToken.d.ts.map +1 -1
  79. package/dist/src/css-variables.d.ts +48 -0
  80. package/dist/src/css-variables.d.ts.map +1 -1
  81. package/dist/src/embed/app.d.ts +37 -0
  82. package/dist/src/embed/app.d.ts.map +1 -1
  83. package/dist/src/embed/conversation.d.ts +127 -9
  84. package/dist/src/embed/conversation.d.ts.map +1 -1
  85. package/dist/src/embed/hostEventClient/contracts.d.ts +3 -3
  86. package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  87. package/dist/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  88. package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  89. package/dist/src/embed/liveboard.d.ts +40 -3
  90. package/dist/src/embed/liveboard.d.ts.map +1 -1
  91. package/dist/src/embed/ts-embed.d.ts +23 -2
  92. package/dist/src/embed/ts-embed.d.ts.map +1 -1
  93. package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
  94. package/dist/src/errors.d.ts +1 -0
  95. package/dist/src/errors.d.ts.map +1 -1
  96. package/dist/src/index.d.ts +3 -3
  97. package/dist/src/index.d.ts.map +1 -1
  98. package/dist/src/types.d.ts +356 -42
  99. package/dist/src/types.d.ts.map +1 -1
  100. package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  101. package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  102. package/dist/src/utils/graphql/answerService/answerService.d.ts +2 -1
  103. package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  104. package/dist/src/utils/processTrigger.d.ts +3 -2
  105. package/dist/src/utils/processTrigger.d.ts.map +1 -1
  106. package/dist/src/utils.d.ts +20 -1
  107. package/dist/src/utils.d.ts.map +1 -1
  108. package/dist/tsembed-react.es.js +501 -98
  109. package/dist/tsembed-react.js +500 -97
  110. package/dist/tsembed.es.js +516 -113
  111. package/dist/tsembed.js +29956 -29553
  112. package/dist/visual-embed-sdk-react-full.d.ts +819 -282
  113. package/dist/visual-embed-sdk-react.d.ts +818 -281
  114. package/dist/visual-embed-sdk.d.ts +882 -321
  115. package/lib/package.json +1 -1
  116. package/lib/src/authToken.d.ts +1 -1
  117. package/lib/src/authToken.d.ts.map +1 -1
  118. package/lib/src/authToken.js +2 -2
  119. package/lib/src/authToken.js.map +1 -1
  120. package/lib/src/authToken.spec.js +72 -1
  121. package/lib/src/authToken.spec.js.map +1 -1
  122. package/lib/src/css-variables.d.ts +48 -0
  123. package/lib/src/css-variables.d.ts.map +1 -1
  124. package/lib/src/embed/app.d.ts +37 -0
  125. package/lib/src/embed/app.d.ts.map +1 -1
  126. package/lib/src/embed/app.js +39 -3
  127. package/lib/src/embed/app.js.map +1 -1
  128. package/lib/src/embed/app.spec.js +24 -0
  129. package/lib/src/embed/app.spec.js.map +1 -1
  130. package/lib/src/embed/conversation.d.ts +127 -9
  131. package/lib/src/embed/conversation.d.ts.map +1 -1
  132. package/lib/src/embed/conversation.js +42 -19
  133. package/lib/src/embed/conversation.js.map +1 -1
  134. package/lib/src/embed/conversation.spec.js +96 -3
  135. package/lib/src/embed/conversation.spec.js.map +1 -1
  136. package/lib/src/embed/hostEventClient/contracts.d.ts +3 -3
  137. package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
  138. package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
  139. package/lib/src/embed/hostEventClient/host-event-client.d.ts +8 -8
  140. package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
  141. package/lib/src/embed/hostEventClient/host-event-client.js +18 -18
  142. package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
  143. package/lib/src/embed/hostEventClient/host-event-client.spec.js +7 -7
  144. package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
  145. package/lib/src/embed/liveboard.d.ts +40 -3
  146. package/lib/src/embed/liveboard.d.ts.map +1 -1
  147. package/lib/src/embed/liveboard.js +41 -13
  148. package/lib/src/embed/liveboard.js.map +1 -1
  149. package/lib/src/embed/liveboard.spec.js +180 -8
  150. package/lib/src/embed/liveboard.spec.js.map +1 -1
  151. package/lib/src/embed/ts-embed.d.ts +23 -2
  152. package/lib/src/embed/ts-embed.d.ts.map +1 -1
  153. package/lib/src/embed/ts-embed.js +64 -22
  154. package/lib/src/embed/ts-embed.js.map +1 -1
  155. package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
  156. package/lib/src/embed/ts-embed.spec.js +139 -20
  157. package/lib/src/embed/ts-embed.spec.js.map +1 -1
  158. package/lib/src/errors.d.ts +1 -0
  159. package/lib/src/errors.d.ts.map +1 -1
  160. package/lib/src/errors.js +1 -0
  161. package/lib/src/errors.js.map +1 -1
  162. package/lib/src/index.d.ts +3 -3
  163. package/lib/src/index.d.ts.map +1 -1
  164. package/lib/src/index.js +2 -2
  165. package/lib/src/index.js.map +1 -1
  166. package/lib/src/types.d.ts +356 -42
  167. package/lib/src/types.d.ts.map +1 -1
  168. package/lib/src/types.js +226 -19
  169. package/lib/src/types.js.map +1 -1
  170. package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
  171. package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
  172. package/lib/src/utils/graphql/answerService/answer-queries.js +22 -0
  173. package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
  174. package/lib/src/utils/graphql/answerService/answerService.d.ts +2 -1
  175. package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
  176. package/lib/src/utils/graphql/answerService/answerService.js +9 -1
  177. package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
  178. package/lib/src/utils/graphql/answerService/answerService.spec.js +73 -0
  179. package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
  180. package/lib/src/utils/processTrigger.d.ts +3 -2
  181. package/lib/src/utils/processTrigger.d.ts.map +1 -1
  182. package/lib/src/utils/processTrigger.js +4 -2
  183. package/lib/src/utils/processTrigger.js.map +1 -1
  184. package/lib/src/utils.d.ts +20 -1
  185. package/lib/src/utils.d.ts.map +1 -1
  186. package/lib/src/utils.js +36 -0
  187. package/lib/src/utils.js.map +1 -1
  188. package/lib/src/utils.spec.js +50 -1
  189. package/lib/src/utils.spec.js.map +1 -1
  190. package/package.json +1 -1
  191. package/src/authToken.spec.ts +91 -2
  192. package/src/authToken.ts +2 -2
  193. package/src/css-variables.ts +60 -0
  194. package/src/embed/app.spec.ts +32 -0
  195. package/src/embed/app.ts +97 -1
  196. package/src/embed/conversation.spec.ts +117 -3
  197. package/src/embed/conversation.ts +188 -29
  198. package/src/embed/hostEventClient/contracts.ts +4 -4
  199. package/src/embed/hostEventClient/host-event-client.spec.ts +7 -1
  200. package/src/embed/hostEventClient/host-event-client.ts +22 -11
  201. package/src/embed/liveboard.spec.ts +264 -10
  202. package/src/embed/liveboard.ts +105 -14
  203. package/src/embed/ts-embed.spec.ts +184 -8
  204. package/src/embed/ts-embed.ts +81 -24
  205. package/src/errors.ts +1 -0
  206. package/src/index.ts +7 -1
  207. package/src/types.ts +364 -40
  208. package/src/utils/graphql/answerService/answer-queries.ts +23 -0
  209. package/src/utils/graphql/answerService/answerService.spec.ts +87 -0
  210. package/src/utils/graphql/answerService/answerService.ts +13 -1
  211. package/src/utils/processTrigger.ts +6 -3
  212. package/src/utils.spec.ts +56 -0
  213. package/src/utils.ts +44 -0
@@ -1,5 +1,5 @@
1
1
  import { ERROR_MESSAGE } from '../errors';
2
- import { HostEvent, MessagePayload } from '../types';
2
+ import { ContextType, HostEvent, MessagePayload } from '../types';
3
3
  import { logger } from '../utils/logger';
4
4
  import { handlePresentEvent } from '../utils';
5
5
  import { getEmbedConfig } from '../embed/embedConfig';
@@ -22,12 +22,13 @@ export const reload = (iFrame: HTMLIFrameElement) => {
22
22
  * @param message
23
23
  * @param message.type
24
24
  * @param message.data
25
+ * @param message.context
25
26
  * @param thoughtSpotHost
26
27
  * @param channel
27
28
  */
28
29
  function postIframeMessage(
29
30
  iFrame: HTMLIFrameElement,
30
- message: { type: HostEvent; data: any },
31
+ message: { type: HostEvent; data: any, context?: any },
31
32
  thoughtSpotHost: string,
32
33
  channel?: MessageChannel,
33
34
  ) {
@@ -42,12 +43,14 @@ export const TRIGGER_TIMEOUT = 30000;
42
43
  * @param messageType
43
44
  * @param thoughtSpotHost
44
45
  * @param data
46
+ * @param context
45
47
  */
46
48
  export function processTrigger(
47
49
  iFrame: HTMLIFrameElement,
48
50
  messageType: HostEvent,
49
51
  thoughtSpotHost: string,
50
52
  data: any,
53
+ context?: ContextType,
51
54
  ): Promise<any> {
52
55
  return new Promise<any>((res, rej) => {
53
56
  if (messageType === HostEvent.Reload) {
@@ -83,6 +86,6 @@ export function processTrigger(
83
86
  res(new Error(ERROR_MESSAGE.TRIGGER_TIMED_OUT));
84
87
  }, TRIGGER_TIMEOUT);
85
88
 
86
- return postIframeMessage(iFrame, { type: messageType, data }, thoughtSpotHost, channel);
89
+ return postIframeMessage(iFrame, { type: messageType, data, context }, thoughtSpotHost, channel);
87
90
  });
88
91
  }
package/src/utils.spec.ts CHANGED
@@ -21,6 +21,8 @@ import {
21
21
  formatTemplate,
22
22
  isValidCssMargin,
23
23
  resetValueFromWindow,
24
+ validateHttpUrl,
25
+ setParamIfDefined,
24
26
  } from './utils';
25
27
  import { RuntimeFilterOp } from './types';
26
28
  import { logger } from './utils/logger';
@@ -824,4 +826,58 @@ describe('getValueFromWindow and storeValueInWindow', () => {
824
826
  expect(getValueFromWindow('key2')).toBe('value2');
825
827
  });
826
828
  });
829
+
830
+ describe('validateHttpUrl', () => {
831
+ test.each([
832
+ ['http URL', 'http://example.com'],
833
+ ['https URL', 'https://example.com'],
834
+ ['https URL with path', 'https://docs.example.com/spotter'],
835
+ ['https URL with query params', 'https://example.com/path?foo=bar'],
836
+ ])('should return [true, null] for valid %s', (_, url) => {
837
+ const [isValid, error] = validateHttpUrl(url);
838
+ expect(isValid).toBe(true);
839
+ expect(error).toBeNull();
840
+ });
841
+
842
+ test.each([
843
+ ['ftp protocol', 'ftp://example.com', 'ftp:'],
844
+ ['file protocol', 'file:///path/to/file', 'file:'],
845
+ ['javascript protocol', 'javascript:alert(1)', 'javascript:'],
846
+ ])('should return [false, Error] for %s', (_, url, protocol) => {
847
+ const [isValid, error] = validateHttpUrl(url);
848
+ expect(isValid).toBe(false);
849
+ expect(error).toBeInstanceOf(Error);
850
+ expect(error?.message).toContain('Invalid protocol');
851
+ expect(error?.message).toContain(protocol);
852
+ });
853
+
854
+ test.each([
855
+ ['invalid URL format', 'not-a-valid-url'],
856
+ ['empty string', ''],
857
+ ['URL without protocol', 'example.com'],
858
+ ])('should return [false, Error] for %s', (_, url) => {
859
+ const [isValid, error] = validateHttpUrl(url);
860
+ expect(isValid).toBe(false);
861
+ expect(error).toBeInstanceOf(Error);
862
+ });
863
+ });
864
+
865
+ describe('setParamIfDefined', () => {
866
+ test.each([
867
+ ['string value', 'testParam', 'testValue', false, 'testValue'],
868
+ ['number value', 'numParam', 42, false, 42],
869
+ ['truthy value as boolean', 'boolParam', 'truthy', true, true],
870
+ ['falsy value as boolean', 'boolParam', 0, true, false],
871
+ ])('should set %s correctly', (_, param, value, asBoolean, expected) => {
872
+ const queryParams: Record<string, unknown> = {};
873
+ setParamIfDefined(queryParams, param, value, asBoolean);
874
+ expect(queryParams[param]).toBe(expected);
875
+ });
876
+
877
+ test('should not set param when value is undefined', () => {
878
+ const queryParams: Record<string, unknown> = {};
879
+ setParamIfDefined(queryParams, 'testParam', undefined);
880
+ expect(queryParams.testParam).toBeUndefined();
881
+ });
882
+ });
827
883
  });
package/src/utils.ts CHANGED
@@ -15,6 +15,7 @@ import {
15
15
  DOMSelector,
16
16
  RuntimeParameter,
17
17
  AllEmbedViewConfig,
18
+ BaseViewConfig,
18
19
  } from './types';
19
20
  import { logger } from './utils/logger';
20
21
  import { ERROR_MESSAGE } from './errors';
@@ -560,6 +561,13 @@ export const formatTemplate = (template: string, values: Record<string, any>): s
560
561
  });
561
562
  };
562
563
 
564
+ export const getHostEventsConfig = (viewConfig: BaseViewConfig) => {
565
+ return {
566
+ shouldBypassPayloadValidation: viewConfig.shouldBypassPayloadValidation,
567
+ useHostEventsV2: viewConfig.useHostEventsV2,
568
+ };
569
+ }
570
+
563
571
  /**
564
572
  * Check if the window is undefined
565
573
  * If the window is undefined, it means the code is running in a SSR environment.
@@ -573,3 +581,39 @@ export const isWindowUndefined = (): boolean => {
573
581
  }
574
582
  return false;
575
583
  }
584
+
585
+ /**
586
+ * Validates that a URL uses only http: or https: protocols.
587
+ * Returns a tuple of [isValid, error] so the caller can handle validation errors.
588
+ * @param url - The URL string to validate
589
+ * @returns [true, null] if valid, [false, Error] if invalid
590
+ */
591
+ export const validateHttpUrl = (url: string): [boolean, Error | null] => {
592
+ try {
593
+ const parsedUrl = new URL(url);
594
+ if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') {
595
+ return [false, new Error(`Invalid protocol: ${parsedUrl.protocol}. Only http: and https: are allowed.`)];
596
+ }
597
+ return [true, null];
598
+ } catch (error) {
599
+ return [false, error instanceof Error ? error : new Error(String(error))];
600
+ }
601
+ };
602
+
603
+ /**
604
+ * Sets a query parameter if the value is defined.
605
+ * @param queryParams - The query params object to modify
606
+ * @param param - The parameter key
607
+ * @param value - The value to set
608
+ * @param asBoolean - If true, coerces value to boolean
609
+ */
610
+ export const setParamIfDefined = <T>(
611
+ queryParams: Record<string, unknown>,
612
+ param: string,
613
+ value: T | undefined,
614
+ asBoolean = false,
615
+ ): void => {
616
+ if (value !== undefined) {
617
+ queryParams[param] = asBoolean ? !!value : value;
618
+ }
619
+ };