@thoughtspot/visual-embed-sdk 1.27.0-alpha.3 → 1.27.0-alpha.4
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/auth.d.ts.map +1 -1
- package/cjs/src/auth.js +5 -4
- package/cjs/src/auth.js.map +1 -1
- package/cjs/src/embed/app.d.ts.map +1 -1
- package/cjs/src/embed/app.js +3 -2
- package/cjs/src/embed/app.js.map +1 -1
- package/cjs/src/embed/app.spec.js +5 -4
- package/cjs/src/embed/app.spec.js.map +1 -1
- package/cjs/src/embed/base.d.ts.map +1 -1
- package/cjs/src/embed/base.js +5 -2
- package/cjs/src/embed/base.js.map +1 -1
- package/cjs/src/embed/base.spec.js +3 -2
- package/cjs/src/embed/base.spec.js.map +1 -1
- package/cjs/src/embed/embed.spec.js +2 -1
- package/cjs/src/embed/embed.spec.js.map +1 -1
- package/cjs/src/embed/embedConfig.d.ts +2 -1
- package/cjs/src/embed/embedConfig.d.ts.map +1 -1
- package/cjs/src/embed/embedConfig.js +2 -0
- package/cjs/src/embed/embedConfig.js.map +1 -1
- package/cjs/src/embed/events.spec.js +3 -2
- package/cjs/src/embed/events.spec.js.map +1 -1
- package/cjs/src/embed/ts-embed.d.ts.map +1 -1
- package/cjs/src/embed/ts-embed.js +13 -10
- package/cjs/src/embed/ts-embed.js.map +1 -1
- package/cjs/src/embed/ts-embed.spec.js +27 -26
- package/cjs/src/embed/ts-embed.spec.js.map +1 -1
- package/cjs/src/index.d.ts +2 -2
- package/cjs/src/index.d.ts.map +1 -1
- package/cjs/src/index.js +2 -1
- package/cjs/src/index.js.map +1 -1
- package/cjs/src/mixpanel-service.d.ts.map +1 -1
- package/cjs/src/mixpanel-service.js +2 -1
- package/cjs/src/mixpanel-service.js.map +1 -1
- package/cjs/src/react/index.d.ts +1 -1
- package/cjs/src/react/index.d.ts.map +1 -1
- package/cjs/src/react/index.js +2 -1
- package/cjs/src/react/index.js.map +1 -1
- package/cjs/src/react/index.spec.js +2 -2
- package/cjs/src/react/index.spec.js.map +1 -1
- package/cjs/src/types.d.ts +39 -9
- package/cjs/src/types.d.ts.map +1 -1
- package/cjs/src/types.js +26 -9
- package/cjs/src/types.js.map +1 -1
- package/cjs/src/utils/authService/authService.d.ts.map +1 -1
- package/cjs/src/utils/authService/authService.js +3 -2
- package/cjs/src/utils/authService/authService.js.map +1 -1
- package/cjs/src/utils/authService/authService.spec.js +3 -2
- package/cjs/src/utils/authService/authService.spec.js.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
- package/cjs/src/utils/authService/tokenizedAuthService.js +2 -1
- package/cjs/src/utils/authService/tokenizedAuthService.js.map +1 -1
- package/cjs/src/utils/logger.d.ts +18 -0
- package/cjs/src/utils/logger.d.ts.map +1 -0
- package/cjs/src/utils/logger.js +80 -0
- package/cjs/src/utils/logger.js.map +1 -0
- package/cjs/src/utils/logger.spec.d.ts +25 -0
- package/cjs/src/utils/logger.spec.d.ts.map +1 -0
- package/cjs/src/utils/logger.spec.js +116 -0
- package/cjs/src/utils/logger.spec.js.map +1 -0
- package/dist/src/auth.d.ts.map +1 -1
- package/dist/src/embed/app.d.ts.map +1 -1
- package/dist/src/embed/base.d.ts.map +1 -1
- package/dist/src/embed/embedConfig.d.ts +2 -1
- package/dist/src/embed/embedConfig.d.ts.map +1 -1
- package/dist/src/embed/ts-embed.d.ts.map +1 -1
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/mixpanel-service.d.ts.map +1 -1
- package/dist/src/react/index.d.ts +1 -1
- package/dist/src/react/index.d.ts.map +1 -1
- package/dist/src/types.d.ts +39 -9
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/authService/authService.d.ts.map +1 -1
- package/dist/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
- package/dist/src/utils/logger.d.ts +18 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.spec.d.ts +25 -0
- package/dist/src/utils/logger.spec.d.ts.map +1 -0
- package/dist/tsembed-react.es.js +164 -54
- package/dist/tsembed-react.js +162 -53
- package/dist/tsembed.es.js +487 -371
- package/dist/tsembed.js +14957 -14842
- package/dist/visual-embed-sdk-react-full.d.ts +42 -11
- package/dist/visual-embed-sdk-react.d.ts +42 -11
- package/dist/visual-embed-sdk.d.ts +42 -11
- package/lib/package.json +1 -1
- package/lib/src/auth.d.ts.map +1 -1
- package/lib/src/auth.js +5 -4
- package/lib/src/auth.js.map +1 -1
- package/lib/src/embed/app.d.ts.map +1 -1
- package/lib/src/embed/app.js +3 -2
- package/lib/src/embed/app.js.map +1 -1
- package/lib/src/embed/app.spec.js +5 -4
- package/lib/src/embed/app.spec.js.map +1 -1
- package/lib/src/embed/base.d.ts.map +1 -1
- package/lib/src/embed/base.js +6 -3
- package/lib/src/embed/base.js.map +1 -1
- package/lib/src/embed/base.spec.js +3 -2
- package/lib/src/embed/base.spec.js.map +1 -1
- package/lib/src/embed/embed.spec.js +2 -1
- package/lib/src/embed/embed.spec.js.map +1 -1
- package/lib/src/embed/embedConfig.d.ts +2 -1
- package/lib/src/embed/embedConfig.d.ts.map +1 -1
- package/lib/src/embed/embedConfig.js +2 -0
- package/lib/src/embed/embedConfig.js.map +1 -1
- package/lib/src/embed/events.spec.js +3 -2
- package/lib/src/embed/events.spec.js.map +1 -1
- package/lib/src/embed/ts-embed.d.ts.map +1 -1
- package/lib/src/embed/ts-embed.js +13 -10
- package/lib/src/embed/ts-embed.js.map +1 -1
- package/lib/src/embed/ts-embed.spec.js +27 -26
- package/lib/src/embed/ts-embed.spec.js.map +1 -1
- package/lib/src/index.d.ts +2 -2
- 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/mixpanel-service.d.ts.map +1 -1
- package/lib/src/mixpanel-service.js +2 -1
- package/lib/src/mixpanel-service.js.map +1 -1
- package/lib/src/react/index.d.ts +1 -1
- package/lib/src/react/index.d.ts.map +1 -1
- package/lib/src/react/index.js +1 -1
- package/lib/src/react/index.js.map +1 -1
- package/lib/src/react/index.spec.js +2 -2
- package/lib/src/react/index.spec.js.map +1 -1
- package/lib/src/types.d.ts +39 -9
- package/lib/src/types.d.ts.map +1 -1
- package/lib/src/types.js +25 -8
- package/lib/src/types.js.map +1 -1
- package/lib/src/utils/authService/authService.d.ts.map +1 -1
- package/lib/src/utils/authService/authService.js +3 -2
- package/lib/src/utils/authService/authService.js.map +1 -1
- package/lib/src/utils/authService/authService.spec.js +3 -2
- package/lib/src/utils/authService/authService.spec.js.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.d.ts.map +1 -1
- package/lib/src/utils/authService/tokenizedAuthService.js +2 -1
- package/lib/src/utils/authService/tokenizedAuthService.js.map +1 -1
- package/lib/src/utils/logger.d.ts +18 -0
- package/lib/src/utils/logger.d.ts.map +1 -0
- package/lib/src/utils/logger.js +74 -0
- package/lib/src/utils/logger.js.map +1 -0
- package/lib/src/utils/logger.spec.d.ts +25 -0
- package/lib/src/utils/logger.spec.d.ts.map +1 -0
- package/lib/src/utils/logger.spec.js +93 -0
- package/lib/src/utils/logger.spec.js.map +1 -0
- package/lib/src/visual-embed-sdk.d.ts +43 -12
- package/package.json +1 -1
- package/src/auth.ts +5 -4
- package/src/embed/app.spec.ts +5 -4
- package/src/embed/app.ts +3 -2
- package/src/embed/base.spec.ts +3 -2
- package/src/embed/base.ts +10 -3
- package/src/embed/embed.spec.ts +2 -1
- package/src/embed/embedConfig.ts +2 -0
- package/src/embed/events.spec.ts +3 -2
- package/src/embed/ts-embed.spec.ts +27 -26
- package/src/embed/ts-embed.ts +20 -16
- package/src/index.ts +2 -0
- package/src/mixpanel-service.ts +2 -1
- package/src/react/index.spec.tsx +2 -2
- package/src/react/index.tsx +1 -0
- package/src/types.ts +34 -2
- package/src/utils/authService/authService.spec.ts +3 -2
- package/src/utils/authService/authService.ts +4 -2
- package/src/utils/authService/tokenizedAuthService.ts +2 -1
- package/src/utils/logger.spec.ts +108 -0
- package/src/utils/logger.ts +88 -0
|
@@ -32,6 +32,7 @@ import * as authInstance from '../auth';
|
|
|
32
32
|
import * as baseInstance from './base';
|
|
33
33
|
import { MIXPANEL_EVENT } from '../mixpanel-service';
|
|
34
34
|
import * as authService from '../utils/authService/authService';
|
|
35
|
+
import { logger } from '../utils/logger';
|
|
35
36
|
|
|
36
37
|
const defaultViewConfig = {
|
|
37
38
|
frameParams: {
|
|
@@ -425,7 +426,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
425
426
|
const searchEmbed = new SearchEmbed(getRootEl(), defaultViewConfig);
|
|
426
427
|
searchEmbed
|
|
427
428
|
.on(EmbedEvent.Save, () => {
|
|
428
|
-
|
|
429
|
+
logger.log('non callable');
|
|
429
430
|
})
|
|
430
431
|
.render();
|
|
431
432
|
|
|
@@ -468,7 +469,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
468
469
|
.on(
|
|
469
470
|
EmbedEvent.Save,
|
|
470
471
|
() => {
|
|
471
|
-
|
|
472
|
+
logger.log('non callable');
|
|
472
473
|
},
|
|
473
474
|
{ start: true },
|
|
474
475
|
)
|
|
@@ -830,7 +831,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
830
831
|
const iFrame: any = document.createElement('div');
|
|
831
832
|
iFrame.contentWindow = null;
|
|
832
833
|
jest.spyOn(document, 'createElement').mockReturnValueOnce(iFrame);
|
|
833
|
-
spyOn(
|
|
834
|
+
spyOn(logger, 'error');
|
|
834
835
|
tsEmbed.render();
|
|
835
836
|
});
|
|
836
837
|
|
|
@@ -844,7 +845,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
844
845
|
|
|
845
846
|
describe('when visible actions are set', () => {
|
|
846
847
|
test('should throw error when there are both visible and hidden actions - pinboard', async () => {
|
|
847
|
-
spyOn(
|
|
848
|
+
spyOn(logger, 'error');
|
|
848
849
|
const pinboardEmbed = new PinboardEmbed(getRootEl(), {
|
|
849
850
|
hiddenActions: [Action.DownloadAsCsv],
|
|
850
851
|
visibleActions: [Action.DownloadAsCsv],
|
|
@@ -853,7 +854,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
853
854
|
} as LiveboardViewConfig);
|
|
854
855
|
await pinboardEmbed.render();
|
|
855
856
|
expect(pinboardEmbed['isError']).toBe(true);
|
|
856
|
-
expect(
|
|
857
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
857
858
|
'You cannot have both hidden actions and visible actions',
|
|
858
859
|
);
|
|
859
860
|
});
|
|
@@ -876,7 +877,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
876
877
|
hiddenActions: Array<Action>,
|
|
877
878
|
visibleActions: Array<Action>,
|
|
878
879
|
) {
|
|
879
|
-
spyOn(
|
|
880
|
+
spyOn(logger, 'error');
|
|
880
881
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
881
882
|
hiddenActions,
|
|
882
883
|
visibleActions,
|
|
@@ -885,7 +886,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
885
886
|
} as LiveboardViewConfig);
|
|
886
887
|
await liveboardEmbed.render();
|
|
887
888
|
expect(liveboardEmbed['isError']).toBe(true);
|
|
888
|
-
expect(
|
|
889
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
889
890
|
'You cannot have both hidden actions and visible actions',
|
|
890
891
|
);
|
|
891
892
|
}
|
|
@@ -921,7 +922,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
921
922
|
|
|
922
923
|
describe('when visible Tabs are set', () => {
|
|
923
924
|
test('should throw error when there are both visible and hidden Tabs - pinboard', async () => {
|
|
924
|
-
spyOn(
|
|
925
|
+
spyOn(logger, 'error');
|
|
925
926
|
const pinboardEmbed = new PinboardEmbed(getRootEl(), {
|
|
926
927
|
visibleTabs: [tabId1],
|
|
927
928
|
hiddenTabs: [tabId2],
|
|
@@ -930,7 +931,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
930
931
|
} as LiveboardViewConfig);
|
|
931
932
|
await pinboardEmbed.render();
|
|
932
933
|
expect(pinboardEmbed['isError']).toBe(true);
|
|
933
|
-
expect(
|
|
934
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
934
935
|
'You cannot have both hidden Tabs and visible Tabs',
|
|
935
936
|
);
|
|
936
937
|
});
|
|
@@ -953,7 +954,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
953
954
|
hiddenTabs: Array<string>,
|
|
954
955
|
visibleTabs: Array<string>,
|
|
955
956
|
) {
|
|
956
|
-
spyOn(
|
|
957
|
+
spyOn(logger, 'error');
|
|
957
958
|
const liveboardEmbed = new LiveboardEmbed(getRootEl(), {
|
|
958
959
|
hiddenTabs,
|
|
959
960
|
visibleTabs,
|
|
@@ -962,7 +963,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
962
963
|
} as LiveboardViewConfig);
|
|
963
964
|
await liveboardEmbed.render();
|
|
964
965
|
expect(liveboardEmbed['isError']).toBe(true);
|
|
965
|
-
expect(
|
|
966
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
966
967
|
'You cannot have both hidden Tabs and visible Tabs',
|
|
967
968
|
);
|
|
968
969
|
}
|
|
@@ -1006,11 +1007,11 @@ describe('Unit test case for ts embed', () => {
|
|
|
1006
1007
|
});
|
|
1007
1008
|
|
|
1008
1009
|
test('Error should be true', async () => {
|
|
1009
|
-
spyOn(
|
|
1010
|
+
spyOn(logger, 'error');
|
|
1010
1011
|
const tsEmbed = new SearchEmbed(getRootEl(), {});
|
|
1011
1012
|
tsEmbed.render();
|
|
1012
1013
|
expect(tsEmbed['isError']).toBe(true);
|
|
1013
|
-
expect(
|
|
1014
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
1014
1015
|
'You need to init the ThoughtSpot SDK module first',
|
|
1015
1016
|
);
|
|
1016
1017
|
});
|
|
@@ -1018,13 +1019,13 @@ describe('Unit test case for ts embed', () => {
|
|
|
1018
1019
|
|
|
1019
1020
|
describe('V1Embed ', () => {
|
|
1020
1021
|
test('when isRendered is true than isError will be true', () => {
|
|
1021
|
-
spyOn(
|
|
1022
|
+
spyOn(logger, 'error');
|
|
1022
1023
|
const viEmbedIns = new tsEmbedInstance.V1Embed(getRootEl(), defaultViewConfig);
|
|
1023
1024
|
expect(viEmbedIns['isError']).toBe(false);
|
|
1024
1025
|
viEmbedIns.render();
|
|
1025
1026
|
viEmbedIns.on(EmbedEvent.CustomAction, jest.fn()).render();
|
|
1026
1027
|
expect(viEmbedIns['isError']).toBe(true);
|
|
1027
|
-
expect(
|
|
1028
|
+
expect(logger.error).toHaveBeenCalledWith(
|
|
1028
1029
|
'Please register event handlers before calling render',
|
|
1029
1030
|
);
|
|
1030
1031
|
});
|
|
@@ -1065,7 +1066,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1065
1066
|
});
|
|
1066
1067
|
|
|
1067
1068
|
test('navigateToPage function use before render', async () => {
|
|
1068
|
-
spyOn(
|
|
1069
|
+
spyOn(logger, 'log');
|
|
1069
1070
|
const appEmbed = new AppEmbed(getRootEl(), {
|
|
1070
1071
|
frameParams: {
|
|
1071
1072
|
width: '100%',
|
|
@@ -1074,7 +1075,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1074
1075
|
});
|
|
1075
1076
|
appEmbed.navigateToPage(path, false);
|
|
1076
1077
|
await appEmbed.render();
|
|
1077
|
-
expect(
|
|
1078
|
+
expect(logger.log).toHaveBeenCalledWith(
|
|
1078
1079
|
'Please call render before invoking this method',
|
|
1079
1080
|
);
|
|
1080
1081
|
});
|
|
@@ -1462,7 +1463,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1462
1463
|
});
|
|
1463
1464
|
|
|
1464
1465
|
// show preRender
|
|
1465
|
-
const warnSpy = spyOn(
|
|
1466
|
+
const warnSpy = spyOn(logger, 'warn');
|
|
1466
1467
|
libEmbed.showPreRender();
|
|
1467
1468
|
expect(warnSpy).toHaveBeenCalledTimes(0);
|
|
1468
1469
|
|
|
@@ -1492,13 +1493,13 @@ describe('Unit test case for ts embed', () => {
|
|
|
1492
1493
|
it('preRender called without preRenderId should log error ', () => {
|
|
1493
1494
|
createRootEleForEmbed();
|
|
1494
1495
|
|
|
1495
|
-
spyOn(
|
|
1496
|
+
spyOn(logger, 'error');
|
|
1496
1497
|
const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
1497
1498
|
liveboardId: 'myLiveboardId',
|
|
1498
1499
|
});
|
|
1499
1500
|
libEmbed.preRender();
|
|
1500
1501
|
|
|
1501
|
-
expect(
|
|
1502
|
+
expect(logger.error).toHaveBeenCalledWith('PreRender id is required for preRender');
|
|
1502
1503
|
});
|
|
1503
1504
|
|
|
1504
1505
|
it('showPreRender should preRender if not available', async () => {
|
|
@@ -1546,7 +1547,7 @@ describe('Unit test case for ts embed', () => {
|
|
|
1546
1547
|
|
|
1547
1548
|
libEmbed.preRender();
|
|
1548
1549
|
await waitFor(() => !!getIFrameEl());
|
|
1549
|
-
const warnSpy = jest.spyOn(
|
|
1550
|
+
const warnSpy = jest.spyOn(logger, 'warn');
|
|
1550
1551
|
const newEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
1551
1552
|
preRenderId: 'i-am-preRendered',
|
|
1552
1553
|
liveboardId: 'awdawda',
|
|
@@ -1565,10 +1566,10 @@ describe('Unit test case for ts embed', () => {
|
|
|
1565
1566
|
liveboardId: 'myLiveboardId',
|
|
1566
1567
|
});
|
|
1567
1568
|
spyOn(libEmbed, 'preRender');
|
|
1568
|
-
spyOn(
|
|
1569
|
+
spyOn(logger, 'error');
|
|
1569
1570
|
libEmbed.showPreRender();
|
|
1570
1571
|
expect(libEmbed.preRender).toHaveBeenCalledTimes(0);
|
|
1571
|
-
expect(
|
|
1572
|
+
expect(logger.error).toHaveBeenCalledTimes(1);
|
|
1572
1573
|
});
|
|
1573
1574
|
|
|
1574
1575
|
it('should get underlying iframe', async () => {
|
|
@@ -1596,16 +1597,16 @@ describe('Unit test case for ts embed', () => {
|
|
|
1596
1597
|
);
|
|
1597
1598
|
});
|
|
1598
1599
|
it('should log error if sync is called before preRender', async () => {
|
|
1599
|
-
jest.spyOn(
|
|
1600
|
+
jest.spyOn(logger, 'error').mockImplementation(jest.fn());
|
|
1600
1601
|
const libEmbed = new LiveboardEmbed('#tsEmbedDiv', {
|
|
1601
1602
|
liveboardId: 'myLiveboardId',
|
|
1602
1603
|
preRenderId: 'test',
|
|
1603
1604
|
});
|
|
1604
1605
|
await libEmbed.syncPreRenderStyle();
|
|
1605
|
-
expect(
|
|
1606
|
+
expect(logger.error).toBeCalledWith(
|
|
1606
1607
|
'PreRender should be called before using syncPreRenderStyle',
|
|
1607
1608
|
);
|
|
1608
|
-
(
|
|
1609
|
+
(logger.error as any).mockClear();
|
|
1609
1610
|
});
|
|
1610
1611
|
});
|
|
1611
1612
|
});
|
package/src/embed/ts-embed.ts
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import isEqual from 'lodash/isEqual';
|
|
11
|
+
import { logger } from '../utils/logger';
|
|
11
12
|
import { getAuthenticationToken } from '../authToken';
|
|
12
13
|
import { AnswerService } from '../utils/graphql/answerService/answerService';
|
|
13
14
|
import {
|
|
@@ -195,7 +196,7 @@ export class TsEmbed {
|
|
|
195
196
|
error,
|
|
196
197
|
});
|
|
197
198
|
// Log error
|
|
198
|
-
|
|
199
|
+
logger.error(error);
|
|
199
200
|
}
|
|
200
201
|
|
|
201
202
|
/**
|
|
@@ -279,7 +280,7 @@ export class TsEmbed {
|
|
|
279
280
|
this.executeCallbacks(EmbedEvent.Error, {
|
|
280
281
|
offlineWarning,
|
|
281
282
|
});
|
|
282
|
-
|
|
283
|
+
logger.warn(offlineWarning);
|
|
283
284
|
};
|
|
284
285
|
window.addEventListener('offline', offlineEventListener);
|
|
285
286
|
|
|
@@ -499,6 +500,9 @@ export class TsEmbed {
|
|
|
499
500
|
queryParams[Param.ShowInsertToSlide] = insertInToSlide;
|
|
500
501
|
}
|
|
501
502
|
|
|
503
|
+
queryParams[Param.OverrideNativeConsole] = true;
|
|
504
|
+
queryParams[Param.ClientLogLevel] = this.embedConfig.logLevel;
|
|
505
|
+
|
|
502
506
|
return queryParams;
|
|
503
507
|
}
|
|
504
508
|
|
|
@@ -949,10 +953,10 @@ export class TsEmbed {
|
|
|
949
953
|
});
|
|
950
954
|
} catch (e) {
|
|
951
955
|
eventPort.postMessage({ error: e });
|
|
952
|
-
|
|
956
|
+
logger.log(e);
|
|
953
957
|
}
|
|
954
958
|
} else {
|
|
955
|
-
|
|
959
|
+
logger.log('Event Port is not defined');
|
|
956
960
|
}
|
|
957
961
|
}
|
|
958
962
|
|
|
@@ -995,7 +999,7 @@ export class TsEmbed {
|
|
|
995
999
|
*/
|
|
996
1000
|
public preRender(showPreRenderByDefault = false): TsEmbed {
|
|
997
1001
|
if (!this.viewConfig.preRenderId) {
|
|
998
|
-
|
|
1002
|
+
logger.error('PreRender id is required for preRender');
|
|
999
1003
|
return this;
|
|
1000
1004
|
}
|
|
1001
1005
|
this.isPreRendered = true;
|
|
@@ -1044,7 +1048,7 @@ export class TsEmbed {
|
|
|
1044
1048
|
this.insertedDomEl?.parentNode.removeChild(this.insertedDomEl);
|
|
1045
1049
|
this.unsubscribeToEvents();
|
|
1046
1050
|
} catch (e) {
|
|
1047
|
-
|
|
1051
|
+
logger.log('Error destroying TS Embed', e);
|
|
1048
1052
|
}
|
|
1049
1053
|
}
|
|
1050
1054
|
|
|
@@ -1084,13 +1088,13 @@ export class TsEmbed {
|
|
|
1084
1088
|
!isUndefined(viewConfig[key])
|
|
1085
1089
|
&& !isEqual(viewConfig[key], preRenderedObject.viewConfig[key])
|
|
1086
1090
|
) {
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1091
|
+
logger.warn(
|
|
1092
|
+
`${viewConfig.embedComponentType || 'Component'} was pre-rendered with `
|
|
1093
|
+
+ `"${key}" as "${JSON.stringify(preRenderedObject.viewConfig[key])}" `
|
|
1094
|
+
+ `but a different value "${JSON.stringify(viewConfig[key])}" `
|
|
1095
|
+
+ 'was passed to the Embed component. '
|
|
1096
|
+
+ 'The new value provided is ignored, the value provided during '
|
|
1097
|
+
+ 'preRender is used.',
|
|
1094
1098
|
);
|
|
1095
1099
|
}
|
|
1096
1100
|
});
|
|
@@ -1105,7 +1109,7 @@ export class TsEmbed {
|
|
|
1105
1109
|
*/
|
|
1106
1110
|
public showPreRender(): void {
|
|
1107
1111
|
if (!this.viewConfig.preRenderId) {
|
|
1108
|
-
|
|
1112
|
+
logger.error('PreRender id is required for preRender');
|
|
1109
1113
|
return;
|
|
1110
1114
|
}
|
|
1111
1115
|
if (!this.isPreRenderAvailable()) {
|
|
@@ -1154,7 +1158,7 @@ export class TsEmbed {
|
|
|
1154
1158
|
*/
|
|
1155
1159
|
public syncPreRenderStyle(): void {
|
|
1156
1160
|
if (!this.isPreRenderAvailable() || !this.el) {
|
|
1157
|
-
|
|
1161
|
+
logger.error('PreRender should be called before using syncPreRenderStyle');
|
|
1158
1162
|
return;
|
|
1159
1163
|
}
|
|
1160
1164
|
const elBoundingClient = this.el.getBoundingClientRect();
|
|
@@ -1174,7 +1178,7 @@ export class TsEmbed {
|
|
|
1174
1178
|
public hidePreRender(): void {
|
|
1175
1179
|
if (!this.isPreRenderAvailable()) {
|
|
1176
1180
|
// if the embed component is not preRendered , nothing to hide
|
|
1177
|
-
|
|
1181
|
+
logger.warn('PreRender should be called before hiding it using hidePreRender.');
|
|
1178
1182
|
return;
|
|
1179
1183
|
}
|
|
1180
1184
|
const preRenderHideStyles = {
|
package/src/index.ts
CHANGED
|
@@ -45,6 +45,7 @@ import {
|
|
|
45
45
|
customCssInterface,
|
|
46
46
|
ContextMenuTriggerOptions,
|
|
47
47
|
RuntimeParameter,
|
|
48
|
+
LogLevel,
|
|
48
49
|
} from './types';
|
|
49
50
|
import { CustomCssVariables } from './css-variables';
|
|
50
51
|
import { SageEmbed, SageViewConfig } from './embed/sage';
|
|
@@ -101,4 +102,5 @@ export {
|
|
|
101
102
|
customCssInterface,
|
|
102
103
|
CustomCssVariables,
|
|
103
104
|
RuntimeParameter,
|
|
105
|
+
LogLevel,
|
|
104
106
|
};
|
package/src/mixpanel-service.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as mixpanel from 'mixpanel-browser';
|
|
2
|
+
import { logger } from './utils/logger';
|
|
2
3
|
|
|
3
4
|
export const EndPoints = {
|
|
4
5
|
CONFIG: '/callosum/v1/system/config',
|
|
@@ -77,7 +78,7 @@ export function initMixpanel(sessionInfo: any): void {
|
|
|
77
78
|
emptyQueue();
|
|
78
79
|
}
|
|
79
80
|
} catch (e) {
|
|
80
|
-
|
|
81
|
+
logger.error('Error initializing mixpanel', e);
|
|
81
82
|
}
|
|
82
83
|
}
|
|
83
84
|
|
package/src/react/index.spec.tsx
CHANGED
|
@@ -49,7 +49,7 @@ describe('React Components', () => {
|
|
|
49
49
|
),
|
|
50
50
|
).toBe(true);
|
|
51
51
|
expect(getIFrameSrc(container)).toBe(
|
|
52
|
-
`http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
|
|
52
|
+
`http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22,%22editACopy%22,%22saveAsView%22,%22updateTSL%22,%22editTSL%22,%22onDeleteAnswer%22]&overrideConsoleLogs=true&clientLogLevel=ERROR&enableDataPanelV2=false&dataSourceMode=hide&useLastSelectedSources=false&isSearchEmbed=true#/embed/answer`,
|
|
53
53
|
);
|
|
54
54
|
});
|
|
55
55
|
|
|
@@ -222,7 +222,7 @@ describe('React Components', () => {
|
|
|
222
222
|
),
|
|
223
223
|
).toBe(true);
|
|
224
224
|
expect(getIFrameSrc(container)).toBe(
|
|
225
|
-
`http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22]&dataSources=[%22test%22]&searchTokenString=%5Brevenue%5D&executeSearch=true&useLastSelectedSources=false&isSearchEmbed=true#/embed/search-bar-embed`,
|
|
225
|
+
`http://${thoughtSpotHost}/?hostAppUrl=local-host&viewPortHeight=768&viewPortWidth=1024&sdkVersion=${version}&authType=None&blockNonEmbedFullAppAccess=true&hideAction=[%22${Action.ReportError}%22]&overrideConsoleLogs=true&clientLogLevel=ERROR&dataSources=[%22test%22]&searchTokenString=%5Brevenue%5D&executeSearch=true&useLastSelectedSources=false&isSearchEmbed=true#/embed/search-bar-embed`,
|
|
226
226
|
);
|
|
227
227
|
});
|
|
228
228
|
});
|
package/src/react/index.tsx
CHANGED
package/src/types.ts
CHANGED
|
@@ -546,6 +546,21 @@ export interface EmbedConfig {
|
|
|
546
546
|
* @version SDK: 1.26.2 | ThoughtSpot: *
|
|
547
547
|
*/
|
|
548
548
|
suppressErrorAlerts?: boolean;
|
|
549
|
+
|
|
550
|
+
/**
|
|
551
|
+
* Log level for the SDK.
|
|
552
|
+
* @default LogLevel.ERROR
|
|
553
|
+
*
|
|
554
|
+
* @example
|
|
555
|
+
* ```js
|
|
556
|
+
* init({
|
|
557
|
+
* ...embedConfig,
|
|
558
|
+
* logLevel: LogLevel.SILENT
|
|
559
|
+
* })
|
|
560
|
+
* ```
|
|
561
|
+
* @version SDK: 1.26.5 | ThoughtSpot: 9.10.0.cl
|
|
562
|
+
*/
|
|
563
|
+
logLevel?: LogLevel;
|
|
549
564
|
}
|
|
550
565
|
|
|
551
566
|
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
|
@@ -1926,7 +1941,7 @@ export enum EmbedEvent {
|
|
|
1926
1941
|
* @version SDK : 1.27.0 | Thoughtspot: 9.8.0.cl
|
|
1927
1942
|
*/
|
|
1928
1943
|
CreateWorksheet = 'createWorksheet',
|
|
1929
|
-
|
|
1944
|
+
/**
|
|
1930
1945
|
* Emitted when Ask Sage is initialized.
|
|
1931
1946
|
*
|
|
1932
1947
|
* @returns viewName: string
|
|
@@ -1935,7 +1950,13 @@ export enum EmbedEvent {
|
|
|
1935
1950
|
* @returns isPublic: boolean
|
|
1936
1951
|
* @version SDK : 1.29.0 | Thoughtspot: 9.12.0.cl
|
|
1937
1952
|
*/
|
|
1938
|
-
|
|
1953
|
+
AskSageInit = 'AskSageInit',
|
|
1954
|
+
/**
|
|
1955
|
+
* Emitted when a LB/viz is renamed
|
|
1956
|
+
*
|
|
1957
|
+
* @version SDK : 1.28.0 | ThoughtSpot: 9.11.0.cl
|
|
1958
|
+
*/
|
|
1959
|
+
Rename = 'renameModalTitleDescription',
|
|
1939
1960
|
}
|
|
1940
1961
|
|
|
1941
1962
|
/**
|
|
@@ -2808,6 +2829,8 @@ export enum Param {
|
|
|
2808
2829
|
HideSearchBarTitle = 'hideSearchBarTitle',
|
|
2809
2830
|
HideSageAnswerHeader = 'hideSageAnswerHeader',
|
|
2810
2831
|
HideSearchBar = 'hideSearchBar',
|
|
2832
|
+
ClientLogLevel = 'clientLogLevel',
|
|
2833
|
+
OverrideNativeConsole = 'overrideConsoleLogs',
|
|
2811
2834
|
enableAskSage = 'enableAskSage',
|
|
2812
2835
|
}
|
|
2813
2836
|
|
|
@@ -3748,3 +3771,12 @@ export interface CustomActionPayload {
|
|
|
3748
3771
|
session: SessionInterface;
|
|
3749
3772
|
vizId?: string;
|
|
3750
3773
|
}
|
|
3774
|
+
|
|
3775
|
+
export enum LogLevel {
|
|
3776
|
+
SILENT = 'SILENT',
|
|
3777
|
+
ERROR = 'ERROR',
|
|
3778
|
+
WARN = 'WARN',
|
|
3779
|
+
INFO = 'INFO',
|
|
3780
|
+
DEBUG = 'DEBUG',
|
|
3781
|
+
TRACE = 'TRACE',
|
|
3782
|
+
}
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
verifyTokenService,
|
|
8
8
|
EndPoints,
|
|
9
9
|
} from '.';
|
|
10
|
+
import { logger } from '../logger';
|
|
10
11
|
|
|
11
12
|
const thoughtSpotHost = 'http://10.79.135.124:3000';
|
|
12
13
|
|
|
@@ -74,14 +75,14 @@ describe('Unit test for authService', () => {
|
|
|
74
75
|
});
|
|
75
76
|
|
|
76
77
|
test('log error on API failures', async () => {
|
|
77
|
-
jest.spyOn(
|
|
78
|
+
jest.spyOn(logger, 'error').mockImplementation(() => undefined);
|
|
78
79
|
global.fetch = jest.fn(() => Promise.resolve({
|
|
79
80
|
text: () => Promise.resolve('error'),
|
|
80
81
|
status: 500,
|
|
81
82
|
ok: false,
|
|
82
83
|
}));
|
|
83
84
|
await fetchSessionInfoService(authVerificationUrl);
|
|
84
|
-
expect(
|
|
85
|
+
expect(logger.error).toHaveBeenCalledWith('Failure', 'error');
|
|
85
86
|
});
|
|
86
87
|
|
|
87
88
|
test('verifyTokenService', async () => {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { logger } from '../logger';
|
|
2
|
+
|
|
1
3
|
export const EndPoints = {
|
|
2
4
|
AUTH_VERIFICATION: '/callosum/v1/session/info',
|
|
3
5
|
SAML_LOGIN_TEMPLATE: (targetUrl: string) => `/callosum/v1/saml/login?targetURLPath=${targetUrl}`,
|
|
@@ -18,7 +20,7 @@ export const EndPoints = {
|
|
|
18
20
|
function failureLoggedFetch(url: string, options: RequestInit = {}): Promise<Response> {
|
|
19
21
|
return fetch(url, options).then(async (r) => {
|
|
20
22
|
if (!r.ok && r.type !== 'opaqueredirect' && r.type !== 'opaque') {
|
|
21
|
-
|
|
23
|
+
logger.error('Failure', await r.text?.());
|
|
22
24
|
}
|
|
23
25
|
return r;
|
|
24
26
|
});
|
|
@@ -45,7 +47,7 @@ export async function verifyTokenService(
|
|
|
45
47
|
});
|
|
46
48
|
return res.ok;
|
|
47
49
|
} catch (e) {
|
|
48
|
-
|
|
50
|
+
logger.error(`Token Verification Service failed : ${e.message}`);
|
|
49
51
|
}
|
|
50
52
|
|
|
51
53
|
return false;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { tokenizedFetch } from '../../tokenizedFetch';
|
|
2
|
+
import { logger } from '../logger';
|
|
2
3
|
import { EndPoints } from './authService';
|
|
3
4
|
|
|
4
5
|
/**
|
|
@@ -9,7 +10,7 @@ import { EndPoints } from './authService';
|
|
|
9
10
|
function tokenisedFailureLoggedFetch(url: string, options: RequestInit = {}): Promise<Response> {
|
|
10
11
|
return tokenizedFetch(url, options).then(async (r) => {
|
|
11
12
|
if (!r.ok && r.type !== 'opaqueredirect' && r.type !== 'opaque') {
|
|
12
|
-
|
|
13
|
+
logger.error('Failure', await r.text?.());
|
|
13
14
|
}
|
|
14
15
|
return r;
|
|
15
16
|
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
let logger: any;
|
|
2
|
+
let LogLevel: any;
|
|
3
|
+
let setGlobalLogLevelOverride: any;
|
|
4
|
+
|
|
5
|
+
const consoleErrorSpy = jest.spyOn(console, 'error');
|
|
6
|
+
const consoleWarnSpy = jest.spyOn(console, 'warn');
|
|
7
|
+
const consoleInfoSpy = jest.spyOn(console, 'info');
|
|
8
|
+
const consoleDebugSpy = jest.spyOn(console, 'debug');
|
|
9
|
+
const consoleTraceSpy = jest.spyOn(console, 'trace');
|
|
10
|
+
|
|
11
|
+
describe('Logger', () => {
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
const a = await import('./logger');
|
|
14
|
+
logger = a.logger;
|
|
15
|
+
LogLevel = a.LogLevel;
|
|
16
|
+
setGlobalLogLevelOverride = a.setGlobalLogLevelOverride;
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
// Reset the logger's log level before each test
|
|
21
|
+
setGlobalLogLevelOverride(LogLevel.TRACE);
|
|
22
|
+
logger.setLogLevel(LogLevel.ERROR);
|
|
23
|
+
|
|
24
|
+
consoleErrorSpy.mockRestore();
|
|
25
|
+
consoleWarnSpy.mockRestore();
|
|
26
|
+
consoleInfoSpy.mockRestore();
|
|
27
|
+
consoleDebugSpy.mockRestore();
|
|
28
|
+
consoleTraceSpy.mockRestore();
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should set the log level correctly', () => {
|
|
32
|
+
logger.setLogLevel(LogLevel.INFO);
|
|
33
|
+
expect(logger.getLogLevel()).toBe(LogLevel.INFO);
|
|
34
|
+
|
|
35
|
+
logger.setLogLevel(LogLevel.DEBUG);
|
|
36
|
+
expect(logger.getLogLevel()).toBe(LogLevel.DEBUG);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('should log messages based on the log level', () => {
|
|
40
|
+
setGlobalLogLevelOverride(undefined);
|
|
41
|
+
|
|
42
|
+
logger.setLogLevel(LogLevel.SILENT);
|
|
43
|
+
logger.logMessages(['log me'], LogLevel.SILENT);
|
|
44
|
+
logger.error('Error message');
|
|
45
|
+
logger.warn('Warning message');
|
|
46
|
+
logger.debug('Debug message');
|
|
47
|
+
expect(consoleErrorSpy).not.toHaveBeenCalled();
|
|
48
|
+
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
49
|
+
expect(consoleDebugSpy).not.toHaveBeenCalled();
|
|
50
|
+
|
|
51
|
+
logger.setLogLevel(LogLevel.ERROR);
|
|
52
|
+
logger.error('Error message');
|
|
53
|
+
logger.warn('Warning message');
|
|
54
|
+
logger.debug('Debug message');
|
|
55
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
|
|
56
|
+
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
57
|
+
expect(consoleDebugSpy).not.toHaveBeenCalled();
|
|
58
|
+
|
|
59
|
+
logger.error('Warning message');
|
|
60
|
+
logger.warn('Warning message');
|
|
61
|
+
logger.debug('Debug message');
|
|
62
|
+
expect(consoleTraceSpy).not.toHaveBeenCalled();
|
|
63
|
+
|
|
64
|
+
logger.setLogLevel(LogLevel.WARN);
|
|
65
|
+
logger.error('Warning message');
|
|
66
|
+
logger.warn('Warning message');
|
|
67
|
+
logger.debug('Debug message');
|
|
68
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Warning message');
|
|
69
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith('Warning message');
|
|
70
|
+
expect(consoleDebugSpy).not.toHaveBeenCalled();
|
|
71
|
+
|
|
72
|
+
logger.setLogLevel(LogLevel.DEBUG);
|
|
73
|
+
logger.error('Warning message');
|
|
74
|
+
logger.warn('Warning message');
|
|
75
|
+
logger.debug('Debug message');
|
|
76
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Warning message');
|
|
77
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith('Warning message');
|
|
78
|
+
expect(consoleDebugSpy).toHaveBeenCalledWith('Debug message');
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it('should log messages with the global log level override', () => {
|
|
82
|
+
setGlobalLogLevelOverride(LogLevel.WARN);
|
|
83
|
+
|
|
84
|
+
logger.error('Error message');
|
|
85
|
+
logger.warn('Warn message');
|
|
86
|
+
logger.info('Info message');
|
|
87
|
+
logger.trace('Trace message');
|
|
88
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
|
|
89
|
+
expect(consoleWarnSpy).toHaveBeenCalledWith('Warn message');
|
|
90
|
+
expect(consoleInfoSpy).not.toHaveBeenCalled();
|
|
91
|
+
expect(consoleDebugSpy).not.toHaveBeenCalled();
|
|
92
|
+
expect(consoleTraceSpy).not.toHaveBeenCalled();
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it('If global level is not set , default local level (error) should be used', () => {
|
|
96
|
+
setGlobalLogLevelOverride(undefined);
|
|
97
|
+
|
|
98
|
+
logger.error('Error message');
|
|
99
|
+
logger.warn('Warn message');
|
|
100
|
+
logger.info('Info message');
|
|
101
|
+
logger.trace('Trace message');
|
|
102
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith('Error message');
|
|
103
|
+
expect(consoleWarnSpy).not.toHaveBeenCalled();
|
|
104
|
+
expect(consoleInfoSpy).not.toHaveBeenCalled();
|
|
105
|
+
expect(consoleDebugSpy).not.toHaveBeenCalled();
|
|
106
|
+
expect(consoleTraceSpy).not.toHaveBeenCalled();
|
|
107
|
+
});
|
|
108
|
+
});
|