@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.
- package/cjs/package.json +1 -1
- package/cjs/src/authToken.d.ts +1 -1
- package/cjs/src/authToken.d.ts.map +1 -1
- package/cjs/src/authToken.js +2 -2
- package/cjs/src/authToken.js.map +1 -1
- package/cjs/src/authToken.spec.js +71 -0
- package/cjs/src/authToken.spec.js.map +1 -1
- package/cjs/src/css-variables.d.ts +48 -0
- package/cjs/src/css-variables.d.ts.map +1 -1
- package/cjs/src/embed/app.d.ts +37 -0
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +37 -1
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +24 -0
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/conversation.d.ts +127 -9
- package/cjs/src/embed/conversation.d.ts.map +1 -1
- package/cjs/src/embed/conversation.js +41 -18
- package/cjs/src/embed/conversation.js.map +1 -1
- package/cjs/src/embed/conversation.spec.js +96 -3
- package/cjs/src/embed/conversation.spec.js.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.d.ts +3 -3
- package/cjs/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/contracts.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts +8 -8
- package/cjs/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.js +18 -18
- package/cjs/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js +7 -7
- package/cjs/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/cjs/src/embed/liveboard.d.ts +40 -3
- package/cjs/src/embed/liveboard.d.ts.map +1 -1
- package/cjs/src/embed/liveboard.js +40 -12
- package/cjs/src/embed/liveboard.js.map +1 -1
- package/cjs/src/embed/liveboard.spec.js +180 -8
- package/cjs/src/embed/liveboard.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts +23 -2
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +64 -22
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +138 -19
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/errors.d.ts +1 -0
- package/cjs/src/errors.d.ts.map +1 -1
- package/cjs/src/errors.js +1 -0
- package/cjs/src/errors.js.map +1 -1
- package/cjs/src/index.d.ts +3 -3
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +3 -2
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/types.d.ts +356 -42
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +227 -20
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/cjs/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.js +23 -1
- package/cjs/src/utils/graphql/answerService/answer-queries.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.d.ts +2 -1
- package/cjs/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.js +9 -1
- package/cjs/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/cjs/src/utils/graphql/answerService/answerService.spec.js +73 -0
- package/cjs/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/cjs/src/utils/processTrigger.d.ts +3 -2
- package/cjs/src/utils/processTrigger.d.ts.map +1 -1
- package/cjs/src/utils/processTrigger.js +4 -2
- package/cjs/src/utils/processTrigger.js.map +1 -1
- package/cjs/src/utils.d.ts +20 -1
- package/cjs/src/utils.d.ts.map +1 -1
- package/cjs/src/utils.js +40 -1
- package/cjs/src/utils.js.map +1 -1
- package/cjs/src/utils.spec.js +49 -0
- package/cjs/src/utils.spec.js.map +1 -1
- package/dist/{index-Dgzjq7qH.js → index-BuwECGdm.js} +1 -1
- package/dist/src/authToken.d.ts +1 -1
- package/dist/src/authToken.d.ts.map +1 -1
- package/dist/src/css-variables.d.ts +48 -0
- package/dist/src/css-variables.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts +37 -0
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/conversation.d.ts +127 -9
- package/dist/src/embed/conversation.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/contracts.d.ts +3 -3
- package/dist/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/dist/src/embed/hostEventClient/host-event-client.d.ts +8 -8
- package/dist/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/dist/src/embed/liveboard.d.ts +40 -3
- package/dist/src/embed/liveboard.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts +23 -2
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/dist/src/errors.d.ts +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/index.d.ts +3 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +356 -42
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/dist/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/dist/src/utils/graphql/answerService/answerService.d.ts +2 -1
- package/dist/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/dist/src/utils/processTrigger.d.ts +3 -2
- package/dist/src/utils/processTrigger.d.ts.map +1 -1
- package/dist/src/utils.d.ts +20 -1
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/tsembed-react.es.js +501 -98
- package/dist/tsembed-react.js +500 -97
- package/dist/tsembed.es.js +516 -113
- package/dist/tsembed.js +29956 -29553
- package/dist/visual-embed-sdk-react-full.d.ts +819 -282
- package/dist/visual-embed-sdk-react.d.ts +818 -281
- package/dist/visual-embed-sdk.d.ts +882 -321
- package/lib/package.json +1 -1
- package/lib/src/authToken.d.ts +1 -1
- package/lib/src/authToken.d.ts.map +1 -1
- package/lib/src/authToken.js +2 -2
- package/lib/src/authToken.js.map +1 -1
- package/lib/src/authToken.spec.js +72 -1
- package/lib/src/authToken.spec.js.map +1 -1
- package/lib/src/css-variables.d.ts +48 -0
- package/lib/src/css-variables.d.ts.map +1 -1
- package/lib/src/embed/app.d.ts +37 -0
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +39 -3
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +24 -0
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/conversation.d.ts +127 -9
- package/lib/src/embed/conversation.d.ts.map +1 -1
- package/lib/src/embed/conversation.js +42 -19
- package/lib/src/embed/conversation.js.map +1 -1
- package/lib/src/embed/conversation.spec.js +96 -3
- package/lib/src/embed/conversation.spec.js.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.d.ts +3 -3
- package/lib/src/embed/hostEventClient/contracts.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/contracts.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.d.ts +8 -8
- package/lib/src/embed/hostEventClient/host-event-client.d.ts.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.js +18 -18
- package/lib/src/embed/hostEventClient/host-event-client.js.map +1 -1
- package/lib/src/embed/hostEventClient/host-event-client.spec.js +7 -7
- package/lib/src/embed/hostEventClient/host-event-client.spec.js.map +1 -1
- package/lib/src/embed/liveboard.d.ts +40 -3
- package/lib/src/embed/liveboard.d.ts.map +1 -1
- package/lib/src/embed/liveboard.js +41 -13
- package/lib/src/embed/liveboard.js.map +1 -1
- package/lib/src/embed/liveboard.spec.js +180 -8
- package/lib/src/embed/liveboard.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts +23 -2
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +64 -22
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +139 -20
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/errors.d.ts +1 -0
- package/lib/src/errors.d.ts.map +1 -1
- package/lib/src/errors.js +1 -0
- package/lib/src/errors.js.map +1 -1
- package/lib/src/index.d.ts +3 -3
- package/lib/src/index.d.ts.map +1 -1
- package/lib/src/index.js +2 -2
- package/lib/src/index.js.map +1 -1
- package/lib/src/types.d.ts +356 -42
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +226 -19
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answer-queries.d.ts +1 -0
- package/lib/src/utils/graphql/answerService/answer-queries.d.ts.map +1 -1
- package/lib/src/utils/graphql/answerService/answer-queries.js +22 -0
- package/lib/src/utils/graphql/answerService/answer-queries.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.d.ts +2 -1
- package/lib/src/utils/graphql/answerService/answerService.d.ts.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.js +9 -1
- package/lib/src/utils/graphql/answerService/answerService.js.map +1 -1
- package/lib/src/utils/graphql/answerService/answerService.spec.js +73 -0
- package/lib/src/utils/graphql/answerService/answerService.spec.js.map +1 -1
- package/lib/src/utils/processTrigger.d.ts +3 -2
- package/lib/src/utils/processTrigger.d.ts.map +1 -1
- package/lib/src/utils/processTrigger.js +4 -2
- package/lib/src/utils/processTrigger.js.map +1 -1
- package/lib/src/utils.d.ts +20 -1
- package/lib/src/utils.d.ts.map +1 -1
- package/lib/src/utils.js +36 -0
- package/lib/src/utils.js.map +1 -1
- package/lib/src/utils.spec.js +50 -1
- package/lib/src/utils.spec.js.map +1 -1
- package/package.json +1 -1
- package/src/authToken.spec.ts +91 -2
- package/src/authToken.ts +2 -2
- package/src/css-variables.ts +60 -0
- package/src/embed/app.spec.ts +32 -0
- package/src/embed/app.ts +97 -1
- package/src/embed/conversation.spec.ts +117 -3
- package/src/embed/conversation.ts +188 -29
- package/src/embed/hostEventClient/contracts.ts +4 -4
- package/src/embed/hostEventClient/host-event-client.spec.ts +7 -1
- package/src/embed/hostEventClient/host-event-client.ts +22 -11
- package/src/embed/liveboard.spec.ts +264 -10
- package/src/embed/liveboard.ts +105 -14
- package/src/embed/ts-embed.spec.ts +184 -8
- package/src/embed/ts-embed.ts +81 -24
- package/src/errors.ts +1 -0
- package/src/index.ts +7 -1
- package/src/types.ts +364 -40
- package/src/utils/graphql/answerService/answer-queries.ts +23 -0
- package/src/utils/graphql/answerService/answerService.spec.ts +87 -0
- package/src/utils/graphql/answerService/answerService.ts +13 -1
- package/src/utils/processTrigger.ts +6 -3
- package/src/utils.spec.ts +56 -0
- 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
|
+
};
|